热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

Java中递归、循环的优劣分析

这篇文章主要给大家介绍了关于Java中递归、循环的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

介绍:

你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归。

但是如果你打开一扇门后,同样发现前方也有一扇门,紧接着你又打开下一扇门.....但是却一直没有碰到尽头--这就是循环。

简单来说:循环是有去无回,而递归是有去有回(因为存在终止条件)。

循环:当满足某一条件时反复执行某一操作(循环体)。

递归:在一个方法内部对自身进行调用的方法。

递归结构包括两个部分:

  1、递归头:即什么时候不调用自身方法,也就是递归的结束条件。如果没有递归头,程序将陷入死循环。

  2、递归体:即什么时候需要调用自身方法。

好了,废话不多说,直接来撸代码(计算阶乘的方法)。

package com.bjwyj.method;
/**
 * 递归和循环的比较
 * @author 吴永吉
 *
 */
public class TestRecursion {
 public static void main(String[] args) {
 //以下调用System下的currentTimeMillis()方法只是为了说明递归调用比循环调用更耗时
 long l1 = System.currentTimeMillis(); 
 System.out.println(factorial(5));
 long l2 = System.currentTimeMillis();
 System.out.println("递归计算阶乘耗时:"+(l2-l1));
 
 System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
 long time1 = System.currentTimeMillis();
 System.out.println(factorialLoop(5));
 long time2 = System.currentTimeMillis();
 System.out.println("循环计算阶乘耗时:"+(time2-time1));
 }
 
 //使用递归定义计算阶乘的方法
 public static long factorial(int num) {
 if(num==1) { //递归头
 return 1;
 }else {
 return num*factorial(num-1); //递归体
 }
 }
 
 //使用循环定义计算阶乘的方法
 public static long factorialLoop(int n) {
 int result = 1; //接收计算结果
 while(n>1) {
 result *= n*(n-1); //实现计算结果的累乘操作
 n -= 2; //每次减去2,实现数字的迭代操作
 }
 return result;
 }
}

执行结果:

120
递归计算阶乘耗时:1
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
120
循环计算阶乘耗时:0

由结果可以看出,使用递归算法比使用循环算法更耗时。

为了更好地比较递归算法的优劣,上述采用while循环与递归算法进行对比。

先来分析上述递归方法的执行过程,如下图:

循环方法的执行过程,如下图:

这里为了看起来清晰,只是简单地画出了栈内存中的执行过程(这样画更便于理解)。

总结:

栈,主要是用来存放栈帧的,每执行一个方法就会出现压栈操作,所以采用递归的时候产生的栈帧比较多,递归就会影响到内存,非常消耗内存。而使用循环就执行了一个方法,压入栈帧一次,只存在一个栈帧,所以比较节省内存。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。


推荐阅读
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 在给定的数组中,除了一个数字外,其他所有数字都是相同的。任务是找到这个唯一的不同数字。例如,findUniq([1, 1, 1, 2, 1, 1]) 返回 2,findUniq([0, 0, 0.55, 0, 0]) 返回 0.55。 ... [详细]
author-avatar
iidt
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有