递归、递推和迭代的区别

递归:函数本身调用自己,实现自身循环。例如:求斐波那契数

一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,

        /// <summary>
        /// 用递归算法实现斐波那契
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public static int Fibonacci_recursion(int i)
        {
            if (i <= 0)
            {
                return 0;
            }
            else if (i > 0 && i <= 2)
            {
                return 1;
            }
            else
            {
                return Fibonacci_recursion(i - 1) + Fibonacci_recursion(i - 2);
            }
        }

递推:根据其已有的数据和关系,逐步推导而得到结果的这个过程。

        /// <summary>
        /// 递推算法实现斐波那契
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        public static int Fibonacci_recurrence(int n)
        {
            if (n <= 0)
                throw new ArgumentOutOfRangeException();
            int a = 1,b = 1;
            for (int i = 3; i <= n; i++)
            {
                b = checked(a + b);
                a = b - a;
            }
            return b;
        }

例如传入的数为46,求第46位斐波那契数,递归与递推的结果与消耗时间分别是:

            Stopwatch sw1 = new Stopwatch();
            sw1.Start();
            Console.WriteLine("递归结果:" + Logic.Fibonacci_recursion(46));
            TimeSpan ts2 = sw1.Elapsed;
            Console.WriteLine("递归算法耗时:" + ts2);
            sw1.Stop();

            Stopwatch sw2 = new Stopwatch();
            sw2.Start();
            Console.WriteLine("递推结果:" + Logic.Fibonacci_recurrence(46));
            sw2.Stop();
            TimeSpan ts1= sw2.Elapsed;
            Console.WriteLine("递推算法耗时:" + ts1);

由此可见递归和递推的算法消耗的时间差点一点半点,这个是因为递归每次都要压栈出栈,所以空间消耗要比非递归代码要大很多。而且如果递归深度太大,可能系统撑不住。

迭代比较简单了,迭代也是一种循环,与循环不同的是 运算变量的同时保存变量的值,保存的结果作为下次循环计算的初始值。 例如:C#中的 yield 关键字

      public IEnumerable<int> GetList()
      {
           int i = 0;
           while (i < 10)
           {
              i++;
              yield return i;
           }
      }

原文地址:https://www.cnblogs.com/lwqstyle/p/9329062.html

时间: 2024-10-19 02:32:29

递归、递推和迭代的区别的相关文章

再谈循环&amp;迭代&amp;回溯&amp;递归&amp;递推这些基本概念

循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值出发反复进行某一运算得到所需结果.-----从已知到未知,从小到达(比如每年长高9cm,20年180,30后270) 回溯:递归时经历的一个过程. 递归:从所需结果出发不断回溯前一运算直到回到初值再递推得到所需结果----从未知到已知,从大到小,再从小到大(你想进bat,那么编程就的牛逼,就得卸载玩

递归--递推之组合数

排列在上一篇中已经写到,是个典型的深搜题,下面是介绍的组合数, 组合的基本定义是, 但是除了用这种传统的方法来求,可以用递归的方式或者是递推的方式来求, 说道递推,只要会递归, 就会递推了.关键的一部是递推式,可以定义一个函数func(int n, int k); 表示求的值,公式先放在这func(n, k) = func(n-1, k-1)+func(n-1,k); 意思就是在n中选去k个数的组合一个多少个,这时就要分两种情况, 一种是选出一组数中包含最后一个元素,它的值就是func(n -

POJ-1163-The Triangle: DP入门 递归 递推

递归思路 超时算法 #include<iostream> using namespace std; #define Size 101 int Triangle[Size][Size]; int n; int GetAns( int i, int j ) { if( i==n ) return Triangle[i][j]; int x=GetAns( i+1, j ); int y=GetAns( i+1, j+1 ); return max(x, y)+Triangle[i][j]; } i

【Java】课后动手动脑及递归递推的应用

1.代码 表示方法为静态方法,在其它类中可以直接通过类名去调用这个方法! 例如public static void main(String[] args){ClassName.prt("abc");}如果不加static,则只有通过该类的对象去调用.例如public static void main(String[] args){ClassName name=new ClassName();name.prt("abc");} 2.线性同余纯随机数生成器 3.代码 4

函数递归 - 递推与回溯 练习题

递归与二分法习题二分法就是在按照从大到小或者从小到大规律排布的列表中,寻找的值通过与中间的值比较大小,从而对列表进行操作,然后再比较的循环过程. 用递归的方法找出列表中的值num = [1,3,4,5,6,8,22,33,55,778,990]def search(search_number,num): if len(num) == 0:return mid = len(num) // 2 mid_nums = num[len(num)//2] if search_number > mid_nu

斐波那契数列数组递归递推的时间空间复杂度的分析

3g0gpapcgj傅节涤澳浩日换崭睹速<http://weibo.com/p/230927987595257304584192> nfdc5g6tss谅渍狙庇淤律臼忠圆账<http://weibo.com/p/230927987596255930617856> 2kvbhyaba6棠妨睦阶月忧杜懊猎茄<http://weibo.com/p/230927987595884084596736> iw27choola戮鸵垦呀粟傧段厍刀推<http://weibo.co

Prob.2[动态规划+递推+划归思想的应用]POJ 1958 Strange Towers Of Hanoi Upd:2020.3.1

传送门:http://poj.org/problem?id=1958 汉诺塔:https://www.cnblogs.com/antineutrino/p/3334540.html 问题引入:这个在标准的三塔问题上又加了一维,我们先考虑三个塔是怎么计算的?可以具体地分成三个步骤: 1.假设A塔上有n个盘子,将A塔上n-1个盘子转移到B塔上. 2.将A塔上剩余的一个盘子转移到C塔上. 3.将B塔上剩余的n-1个盘子转移到C塔上 因为后转移的盘子小,上面n-1个盘子都能落在上面,2之后的C柱可以看成

深究递归和迭代的区别 联系 优缺点及实例对比

深究递归和迭代的区别.联系.优缺点及实例对比 1.概念区分 递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合. 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身; 2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口. 递归分为两个阶段: 1)递推:把复杂的问题的求

递归和迭代的区别

递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合. 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身; 2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口. 递归分为两个阶段: 1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解; 2)回归:当获得最简单