递归求解斐波那契数列
2013-08-28 23:50
274 查看
数据结构与算法分析-C语言描述(笔记)这本书里的第9页提到了递归的四条基本法则,其中第四条是:
4.合成效益法则:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。
法则的应用:
求斐波那契数列最容易想到的就是递归调用了
可以看到上面的代码使用递归调用,其实这个方法在n稍微大点的情况下,效率会很低下。
这些是因为,这个方法违反了第四条法则。
计算fib(n)的时候会调用fib(n-1)和fib(n-2).
而计算fib(n-1)时会调用fib(n-2)和fib(n-3).
那么fib(n-2)被重复计算了。当n很大的时候,累积起来的重复计算很多。
所以在计算斐波那契数列的时候,不能采用递归方法
优化过后的递归方法:
4.合成效益法则:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。
法则的应用:
求斐波那契数列最容易想到的就是递归调用了
long fib(int n){ if(n <= 1){ return 1; } else{ return fib(n - 1) + fib(n - 2); } }
可以看到上面的代码使用递归调用,其实这个方法在n稍微大点的情况下,效率会很低下。
这些是因为,这个方法违反了第四条法则。
计算fib(n)的时候会调用fib(n-1)和fib(n-2).
而计算fib(n-1)时会调用fib(n-2)和fib(n-3).
那么fib(n-2)被重复计算了。当n很大的时候,累积起来的重复计算很多。
所以在计算斐波那契数列的时候,不能采用递归方法
优化过后的递归方法:
private static void test19(){ int max = 13; long[] templeResult = new long[max + 1]; System.out.println("f2(13):" + f2(max, templeResult)); }
private static long f2(int n, long[] templeResult){ if(n == 0){ return 0; } else if(n == 1){ return 1; } else if(templeResult == 0){ System.out.println("n = " + n); templeResult = f2(n-1, templeResult) + f2(n-2, templeResult); } return templeResult ; }
相关文章推荐
- 非递归求解斐波那契数列第n项的值
- 斐波那契数列的递归与非递归求解方法&递归的优缺点
- 非递归求解斐波那契数列
- 用递归,迭代,通项公式三种方法实现斐波那契数列求解
- 递归-求解斐波那契数列
- 非递归-求解斐波那契数列
- DP思想在斐波那契数列递归求解中的应用
- 第十二周项目3-用递归的方法求解(斐波那契数列)
- 用递归实现斐波那契数列(Fibonacci Sequence )的函数
- 最长公共子序列求解:递归与动态规划方法
- 数据结构(C#)--斐波那契数列的递归实现方法
- 迷宫问题递归与非递归求解
- C++——递归求解函数
- 从“递归结构”到解汉诺塔问题的求解
- 汉诺塔问题(递归求解)
- 斐波那契数列递归和非递归
- fibonacii数列(斐波那契数列)的递归实现及循环实现
- [Java实现]Filbonacci斐波那契数列递归带来的问题和改进
- 递归求解几类排列组合问题(四、普通选择性组合排列)
- 第四周项目5-用递归方法求解(1)