动态规划对比递归----以求斐波那契数列为例

下面是递归方式:

private static int Fib_RE(int n)
        {
            re_Count++;

            if(n<=1)
            {
                return 1;
            }
            else
            {
                return Fib_RE(n-1) + Fib_RE(n-2);
            }
        }

下面是动态规划:

private static int Fib_Fast(int n,Dictionary<int, int> dic)
        {
            fa_Count++;
            if(!dic.ContainsKey(n))
            {
                dic.Add(n, Fib_Fast(n-1,dic)+Fib_Fast(n-2,dic));
            }

            return dic[n];
        }

测试过程:

            const int NUM = 40;

            Stopwatch sw = new Stopwatch();
            sw.Start();

            int result_re = Fib_RE(NUM);

            sw.Stop();

            Console.WriteLine(" Fib_RE({0})={1}:  time: {2}, times: {3}", NUM,result_re, sw.ElapsedTicks, re_Count);

            sw.Reset();
            sw.Start();

            Dictionary<int, int> dic = new Dictionary<int, int>();

            dic.Add(0,1);
            dic.Add(1,1);

            int result_fa = Fib_Fast(NUM,dic);

            sw.Stop();
            Console.WriteLine(" Fib_Fast({0})={1}: time: {2}, times: {3}", NUM,result_fa, sw.ElapsedTicks, fa_Count);

结果:

时间将近2万倍。。。。。。

时间: 2024-09-30 14:14:33

动态规划对比递归----以求斐波那契数列为例的相关文章

使用递归方式和非递归方式求斐波那契数

/** * 非递归斐波那契数列 * @param args */ public static int getFieibolaLie(int number) { int data = 0; int n = 1; int m = 1; if (number <= 0) { return -1; } if (number == 1 || number == 2) { return 1; } while (number >= 2) { data += n; n = m; m = data; numbe

php 两种方式实现求 斐波那契数

使用递归方式. //使用递归方式求斐波那契数 public function fb($n){ // if( $n <=2){ return 1; }else{ return fb($n-1) + fb($n-2); } } 使用递推方式. //使用递推方式求斐波那契数 public function fb2($n){ // if( $n <=2){ return 1; } $t1 = 1;$t2 = 1; for($i=3;$i<$n;$i++){ $temp = $t1; $t1 =

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

递归是一种强有力的技巧,但和其他技巧一样,它也可能被误用. 一般需要递归解决的问题有两个特点: 存在限制条件,当符合这个条件时递归便不再继续: 每次递归调用之后越来越接近这个限制条件. 递归使用最常见的一个例子就是求阶乘,具体描述和代码请看这里:C语言递归和迭代法求阶乘 但是,递归函数调用将涉及一些运行时开销--参数必须压到堆栈中,为局部变量分配内存空间(所有递归均如此,并非特指求阶乘这个例子),寄存器的值必须保存等.当递归函数的每次调用返回时,上述这些操作必须还原,恢复成原来的样子.所以, 基

hdu1568&amp;&amp;hdu3117 求斐波那契数前四位和后四位

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568 题意:如标题所示,求斐波那契数前四位,不足四位直接输出答案 斐波那契数列通式: 当n<=20的时候,不足四位,所以直接打表. 当n>20的时候,大于四位的时候,ans满足这个公式:ans=-0.5*log10(5.0)+num*1.0*log10((1+sqrt(5.0))/2.0); 这个公式是怎么来的呢?我们可以对an取10的对数,根据对数的性质. log10(ans)=log10(1/

递归求斐波那契数

斐波那契数列主要思想是利用前两个数求和算出下一个数,利用函数的递归思想,F(n)=F(n-1)+F(n-2),F(n)先搁置,计算F(n-1),要计算F(n-1)就要先计算F(n-2)和F(n-3),依次递归下去,直到第一第二位数,这两个数是已知的,这样就可以回去一层一层的算出F(3).F(4).F(5)....F(n-2).F(n-1),最后得到F(n)的值. 1 using System; 2 using System.Collections.Generic; 3 using System.

求斐波那契数的python语言实现---递归和迭代

迭代实现如下: def fab(n): n1 = 1 n2 = 1 if n<1: print("输入有误!") return -1 while (n-2)>0: n3 = n2+n1 n1 = n2 n2 = n3 n-=1 return n3 number = int(input("请输入要求的斐波那契数的第几个数:")) result = fab(number) print(result) 递归实现如下: def fab(n): if n==1 o

HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】

Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来. 接下来,CodeStar决定要考考他,于是每问他一

使用元编程,用最简单的递归构造快速斐波那契数函数。

使用元编程和模板递归技术,既可以使最原始的递归方程具备惊人的快速高效. template <int T> class metafib { public: static const long long fib=metafib<T-1>::fib+metafib<T-2>::fib; }; template <> class metafib<1> { public: static const int fib=1; }; template <&g

以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划主要用于解决包含重叠子问题的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存重复子问题的解,然后逐步合并成为原问题的解.动态规划的关键是用记忆法储存重复问题的答案,避免重复求解,以空间换取时间. 用动态规划解决的经典问题有:最短路径(shortest path),0-1背包问题(K