递归和迭代的对比

递归和迭代的对比递归和迭代的对比递归迭代特点递归程序调用自身的编程技巧称为递归(recursion)。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小递…

大家好,又见面了,我是你们的朋友全栈君。

待到秋来九月八,我花开后百花杀

递归

程序调用自身的编程技巧称为递归(recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小
递归主要是将长问题变成子问题解决,例如:
求n的阶乘

//An highlighted block 
var foo = 'bar';
int fact(int n){ 
   
  if(n <= 1)
      return 1;
  else
      return n * fact(n - 1);
}

递归过程演示图

迭代

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。
迭代的主要思考方式是:循环反馈计算
例如:
求n的阶乘

  //An highlighted block 
    var foo = 'bar';
    int fact1(int n)
    { 
   
      int sum = 1;
      int i = 1;
      for(;i <= n;i++){ 
   
        sum *= i;
      }
      return sum;
    }

特点

我们可以发现相比于迭代,递归代码块更加简洁轻便,而迭代冗长。但是如果用于计算量较大的问题呢?
求第n个斐波那契数。(不考虑溢出)
递归:

  //An highlighted block 
    var foo = 'bar';
    int fib(int n)
    { 
   
      if(n <= 2)
        return 1;
      else
        return fib(n - 1) + fib(n - 2);
    }

fib(50)的计算时间fib(50)的计算时间

迭代:

//An highlighted block
 var foo = 'bar';
int fib1(int n)
{ 
   
 int first = 1;
 int second = 1;
 int third = 1;
 while (n > 2) { 
   
  third = first + second;
  first = second;
  second = third;
  n--;
 }
 return third;
}

fib1(50)所用时间fib1(50)所用时间

明显可以看到递归所使用的时间复杂度远大于迭代。

为什么递归费时间呢?那么我们再看一下递归在内存中的情况:
我们拿阶乘问题作例子:
内存中的详解
在程序递归过程中,每调用一次函数就会创建一个栈帧结构,而在每个栈帧结构中就会创建各自的局部变量,就会占用内存,相比于迭代,在内存方面,递归也占用了更多内存,空间复杂度更高。

综上所述,尽管递归看起来代码简单,但是无论是时间复杂度和空间复杂度来说都是迭代更好,所以在项目中还是推荐使用迭代而不是递归。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135052.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 钩子函数是什么?(函数那个小钩子哪里调出来)

    什么是钩子函数?先来看一段百科:钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。emmmm,认认真真读三遍。get关键词,在系统级对所有消息进行过滤,这是什么意思呢?是说钩子函数是在一个事件触发的时候,在系统级捕获到了他,然后做一…

    2022年4月12日
    50
  • 【网络流24题】-题表

    【网络流24题】-题表最近都不知道自己在干什么==2016-11-0808:37:35转载于:https://www.cnblogs.com/Konjakmoyu/p/6041412.html

    2022年5月24日
    38
  • 红旗linux 桌面10 下载,想要红旗桌面操作系统10(RedFlag Desktop Linux10)的请联系红旗官方…「建议收藏」

    红旗linux 桌面10 下载,想要红旗桌面操作系统10(RedFlag Desktop Linux10)的请联系红旗官方…「建议收藏」当前红旗桌面操作系统10(RedFlagDesktopLinux10)已经正式推出,如果有需要下载或者安装光盘的用户建议联系红旗官方,以获知获取RedFlagDesktopLinux10的渠道,安装请参考红旗Linux系统RedFlagLinuxDesktop9.0安装教程。红旗桌面操作系统10亮点介绍RedFlagDesktopLinux10使用Linux4.18内…

    2022年8月22日
    3
  • pychram2021.11.3激活【2021免费激活】

    (pychram2021.11.3激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~9ZHR…

    2022年3月28日
    57
  • java读取pfx格式的证书-并获取公钥私钥

    java读取pfx格式的证书-并获取公钥私钥packagecom.hgh.javase.security;importjava.io.FileInputStream;importjava.security.KeyStore;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.cert.Certificate;im

    2022年5月1日
    155
  • Struts2运行错误:Error filterStart

    Struts2运行错误:Error filterStart困扰我近10多天的问题,让我在框架功力修炼上几乎停滞不前,今天问题被KO,小小的高兴下。 纯洁的web.xml文件struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts2/*

    2022年7月11日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号