精华内容
下载资源
问答
  • 迭代与递归的区别

    万次阅读 多人点赞 2018-09-04 15:52:12
    迭代递归的区别: 从“编程之美”的角度看,可以借用一句非常经典的话:“迭代是人,递归是神!”来从宏观上对二者进行把握。 递归:重复调用函数自身实现循环称为递归;  递归实际上不断地深层调用函数,直到...

    迭代和递归的区别:

    从“编程之美”的角度看,可以借用一句非常经典的话:“迭代是人,递归是神!”来从宏观上对二者进行把握。

    • 递归:重复调用函数自身实现循环称为递归;

           递归实际上不断地深层调用函数,直到函数有返回才会逐层的返回,递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,因此,递归涉及到运行时的堆栈开销(参数必须压入堆栈保存,直到该层函数调用返回为止),所以有可能导致堆栈溢出的错误;但是递归编程所体现的思想正是人们追求简洁、将问题交给计算机,以及将大问题分解为相同小问题从而解决大问题的动机。

             例如:if else 调用自己,并在合适时机退出

     

    • 迭代:利用变量的原值推出新值称为迭代,或着说迭代是函数内某段代码实现循环;

            迭代大部分时候需要人为的对问题进行剖析,分析问题的规律所在,将问题转变为一次次的迭代来逼近答案。迭代不像递归那样对堆栈有一定的要求,另外一旦问题剖析完毕,就可以很容易的通过循环加以实现。迭代的效率高,但却不太容易理解,当遇到数据结构的设计时,比如图表、二叉树、网格等问题时,使用就比较困难,而是用递归就能省掉人工思考解法的过程,只需要不断的将问题分解直到返回就可以了。

             例如:for,while循环

    • 两者关系:所有的迭代可以转换为递归,但递归不一定可以转换成迭代。

     总结如下:

     定义优点缺点
    递归重复调用函数自身实现循环

    a.用有限的循环语句实现无限集合;

    b.代码易读;

    c.大问题转化成小问题,减少了代码量。

    a.递归不断调用函数,浪费空间

    b.容易造成堆栈溢出

    迭代

    利用变量的原值推出新值;

    函数内某段代码实现循环。

    a.效率高,运行时间只随循环的增加而增加;

    b.无额外开销。

    a.代码难理解;

    b.代码不如递归代码简洁;

    c.编写复杂问题时,代码逻辑不易想出

    两者关系

    a.递归中一定有迭代,但是迭代中不一定有递归;大部分可以相互转换。

    b.相对来说,能用迭代不用递归(因为递归不断调用函数,浪费空间,容易造成堆栈溢出)

    展开全文
  • 迭代与递归并不是一种具体算法,而是一种看待问题的思想 通常有的问题既可以用迭代法,又可以用递归法来解决,所以容易使人迷惑而不明白两者的区别。 两者的概念: 迭代迭代是重复反馈过程的活动,其目的通常...

    迭代与递归并不是一种具体算法,而是一种看待问题的思想

    通常有的问题既可以用迭代法,又可以用递归法来解决,所以容易使人迷惑而不明白两者的区别。

     

    两者的概念:

    迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。

    每一次对过程的重复称作一次迭代,而每一次迭代得到的结果会作为下一次迭代的初始值。

    递归:解决问题的某一步骤中,又产生新的子问题,并且子问题的解决方式同原来的问题的解决步骤相同。

    当新的子问题得到解决时,再回过头来继续解决原来的问题,则会发现问题迎刃而解。

     

    现在通过一个简单的例子,体会两者的差异。

    例:写一段程序来计算一个数的阶乘。

    已知:n! = n * (n-1) * (n-2) * (n-3) *...*  2  * 1

    方法一:迭代法

    例如计算 5的阶乘,我们知道5! = 5 * 4 * 3 * 2 *1

    第1次:result = 5

    第2次:result =  (5) * 4 = 20

    第3次:result = (5 * 4) * 3 = 20 * 3 = 60

    第4次:result = (5 * 4 * 3) * 2 = 60 * 2 = 120

    第5次:result =( 5 * 4 * 3 * 2 ) * 1 = 120 * 1 = 120

    经过5次迭代,得到正确的结果。而且我们发现括号里面的可以用上一次迭代的结果进行代替。

    那么此时我们可以编写程序(Python语言):

    n = 5                #计算5的阶乘
    result = n           #第一次迭代
    result = result * 4  #第二次迭代
    result = result * 3
    result = result * 2
    result = result * 1
    
    print(result)        #输出结果:120

    当然我们可以继续寻找规律,后面的因子每次都减一。

    此时我们可以改造程序,利用循环控制变量的递减

    n = 5                #计算5的阶乘
    result = n           
    i = n-1              
    while(i >= 1) :
        result = result * i
        i = i - 1
    
    print(result)        #输出结果:120

     

    方法二:递归

    用递归的角度看待这个问题:

    5! = 5 * 4!

    4! = 4 * 3!

    3! = 3 * 2!                                        

    2! = 2 * 1!

    1! = 1

    求5的阶乘的步骤中,出现了求4的阶乘,求4的阶乘与求5的阶乘的步骤一样,到最后能求出1的阶乘。

    所以我们可以先解决子问题,得到子问题的解,但是求子问题的解只是原来问题的一个步骤,所以一定有一个回归的过程。

    要注意的是,一定要有一个递归的出口才能得到问题的解,否则永远产生在产生新的问题,就无法解决。

    递归求解过程

     

     

    所以阶乘的递归定义式:

    令 f(n) = n!

    当n =1 时,f(n) = 1 ;

    当  n>1 时,f(n) = n * (n-1)! 

    所以我们可以编写以下程序:

    # 定义阶乘函数
    def f(n):
        if n == 1 :
            return 1
        return n * f(n-1)
    
    result = f(5)
    print(result)

     

    从上面可以看出,根据不同的思想,解决问题的办法不同,写出来的程序自然不同。

    我们更加重要的是明白算法的思想,利用算法思想可以解决很多看起来相对复杂的问题。

    展开全文
  • 迭代与递归

    2017-09-18 18:36:12
    一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合. 使用递归要...

    递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.

    一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.

    使用递归要注意的有两点:

    1)递归就是在过程或函数里面调用自身;

    2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口.

     

    递归分为两个阶段:

    1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;

    2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.

     

    利用递归可以解决很多问题:如背包问题,汉诺塔问题,...等.

    斐波那契数列为:0,1,1,2,3,5...

    fib(0)=0;

    fib(1)=1;

    fib(n)=fib(n-1)+fib(n-2);

    int fib(int n)  
    {  
       if(0 == n)  
           return 0;  
       if(1 == n)  
           return 1;  
       if(n > 1)  
           return fib(n-1)+fib(n-2);  
    }  

    迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B.

    递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出.

    迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。



    展开全文
  • C语言,迭代与递归

    千次阅读 多人点赞 2018-08-22 11:56:28
    递归( recursion)是程序调用自身的编程技巧。 个人理解 迭代:通过循环不断重复一个过程,这个过程是一个或若干个旧值通过该过程获得一个或若干个新值的过程,而得到的新值又充当下一个相同过程的旧值,直到...

    概念

    迭代(iteration)是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
    递归( recursion)是程序调用自身的编程技巧。

    *迭代跟递归本质都是一种方法。而递归函数顾名思义,这个函数运用了递归这个方法。


    个人理解

    迭代:通过循环不断重复一个过程,这个过程是一个或若干个旧值通过该过程获得一个或若干个新值的过程,而得到的新值又充当下一个相同过程的旧值,直到循环得到自己期望的结果。循环执行一次过程就是一次迭代。**迭代不是循环,迭代需要用到循环。
    它的特点是,一个过程结束后再次进行该过程。
    它的思路是,从前往后推理。

    打个比方,文件夹A里有一个文件夹B,文件夹B中有一个文件夹C,文件夹C中有一个文件夹D。想要得到文件夹D,我们的方法是打开文件夹A得到文件夹B,打开文件夹B得到文件夹C,打开文件夹C得到文件夹D。

    //过程是 文件夹 = 文件夹 + 打开文件夹
    
    文件夹B = 文件夹A + 打开文件夹
    文件夹C = 文件夹B + 打开文件夹
    文件夹D = 文件夹C+ 打开文件夹

    所谓从前往后推理,就是通过A找到B,通过B找到C,通过C找到D。

    等号右面的文件夹指的是需要打开的文件夹(旧值),等号左面的文件夹指的是通过打开旧文件夹操作得到的文件夹(新值)。打开旧文件夹得到新文件夹就是一次迭代过程。


    个人理解

    递归:执行一个过程中需要再次调用该过程。
    它的特点是,一个过程运算中再次用到该过程。*
    他的思路是,从后往前推理。

    还是以上一个比方为例。

    //过程是 文件夹 = 文件夹 + 打开文件夹
    
    文件夹D = (文件夹C = (文件夹B = 文件夹A + 打开文件夹) + 打开文件夹) + 打开文件夹

    所谓从后往前推理,想要找到D就要找到C,而想要找到C就要找到B,而想要找到B就要找到A。


    迭代与递归
    1.递归中一定有迭代,迭代中不一定有递归。(记住,感兴趣可取找一些递归,迭代试一下)
    2.能用迭代就别用递归。递归容易造成溢出​。
    为什么?
    还是以上个比方为例,迭代执行到最后一步就只需计算

    文件夹D = 文件夹C+ 打开文件夹

    而递归执行到最后一步

    文件夹D = (文件夹C = (文件夹B = 文件夹A + 打开文件夹) + 打开文件夹) + 打开文件夹

    迭代和递归的次数越多,我们会发现迭代依然只需要一个简单的式子,而递归式子会越来越长。
    在纸上写下这两个式子,是不是发现递归式子占用的地方大?在计算机中内存也是同样的道理。

    溢出,这里简单来说就是,内存就这么大小,递归次数越多,式子越长,占用的内存越多。当式子长到内存放不下了,就溢出了。

    为什么还要用递归:采用递归编写程序能使程序变得简洁和清晰。现代程序要求高可读性与低资源占用,递归完全违反了这两点,所以一般运用在不太占用资源且很普遍运用的地方。

    ※借鉴网上资料与自己总结,如有错误或建议,望提出,我会加以修改或补充,感谢。

    展开全文
  • 1.循环迭代实现 $arr = [ 1=>['id'=>1,'name'=>'父1','father'=>NULL], 2=>['id'=>2,'name'=>'父2','father'=>NULL], 3=>['id'=>3,'name'=>'父3','father'=>NULL], 4=>['id'=>4,'name'=>'儿1-1','father'=>1], ...
  • 偶然看到了迭代与递归,抱着学习的心态去百度了各种答案,什么函数关系什么代码看的是一头雾水,于是在半个小时的努力下终于搞懂了递归与迭代的区别,在这里分享给各位我自己是怎么样理解这俩的区别的,可能有些土...
  • 递归 定义:函数自己调用自己来实现循环 理解:递归实际上不断地深层调用函数,直到函数有返回才会逐层的返回,递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,因此,递归涉及到运行时的堆栈开销(参数...
  • 定义 优点 缺点 递归 程序调用自身的编程技巧称为递归 1)大问题化为小问题,可以极大的减少代码量;2)用有限的语句来定义对象的无限集合.;3)代码更简洁清晰,可读性更好 ... 迭代 利用变量的...
  • 在思考递归过程时候,结合函数分配的栈空间理解起来会容易的多。 即系统调用函数时会分配一段栈帧,这段栈帧用于临时变量的保存、现场的保护(函数的返回值和参数、调用前寄存器的状态,调用前栈
  • 迭代与递归实现

    2018-10-06 13:41:37
    迭代(iterate)与递归(recursion)是解决问题常用的两种方法。 递归指方法在内部调用自身。方法调用的时候,每次调用时要做地址保存,参数传递等。 迭代通过循环来重复执行同一步骤,一般递归都可以转化为迭代来...
  • 一个长期别人误会的问题——迭代与递归的性能——这下说清楚了 递归真的会比迭代性能差吗?在《Racket指南》(2.3.4 递归迭代)中,Racket的作者做了清晰的解释—— 在许多语言中,尽可能地将尽可能多的计算合并...
  • C++ 迭代与递归 浅析

    千次阅读 2015-07-24 10:06:58
    本文从迭代与递归的概念、源码示例以及源码分析三个维度,详细介绍并深入比较迭代与递归,这两个C++中常见的概念。
  • javascript 迭代与递归

    2018-04-23 13:14:00
    1 2 // //原生js ...jQuery:有链式编程隐式迭代递归:函数自己调用自己; 迭代:A不断地调用B。 (后续完善解读) 转载于:https://www.cnblogs.com/knuzy/p/8918262.html
  • Python中的迭代与递归

    2020-03-01 15:42:06
    Python中的迭代与递归 递归迭代都是循环的一种。简单地说,递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环。 使用递归每次调用都涉及到压栈弹栈和恢复寄存器的栈操作,非常费内存。 例如斐波那契...
  • Java中的迭代与递归

    2019-03-08 17:27:03
    1. 递归 考虑阶乘函数:n!=n*(n-1)*(n-2)*…*1 计算阶乘有很多方法。一种方法是n!等于n*(n-1)!因此,程序可以直接写成: 项目1: 为了运行这个程序,计算机需要建立一个乘法链:阶乘(n)→阶乘(n-1)→阶乘(n-2)→...
  • 五、迭代与递归 减而治之 分而治之 六、动态规划 一、计算(数据结构算法研究的对象和目标) 计算:即信息处理。是指借助某种工具,遵循一定规则,以明确而机械的形式进行的操作。 计算...
  • 迭代递归的理解和区别

    万次阅读 多人点赞 2019-05-08 13:44:59
    最近做一些题经常会碰到迭代的方法解的,或者递归解法,容易搞混,特在此整理一下 一.递归: 由例子引出,先看看递归的经典案例都有哪些 1.斐波那契数列 斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1...
  • 所谓动态规划:就是通过递归,找出问题本质,并且给出一个初步的解之后,再将其等效的转换为迭代的形式。 make it work make it right make it fast 两个栗子: 1. 斐波那契数列(青蛙跳台阶): 解决方法A:...
  • 迭代与递归算法

    2012-03-25 14:35:27
    迭代与递归算法
  • 迭代方法_求n的阶乘 def factorial(n): result = n for i in range(1, n): result *= i return result number = int(input("请输入一个正整数:")) result1 = factorial(number) print("%d的阶乘为:%d" % ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 144,902
精华内容 57,960
关键字:

迭代与递归