斐波那契数列的实现(简单递归和动态规划)
2016-09-29 11:08
375 查看
斐波那契数列的实现(简单递归和动态规划)
一、简单递归的实现
#include "stdafx.h" #include <string> using namespace std; int f(int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } return f(n - 1) + f(n - 2); } int _tmain(int argc, _TCHAR* argv[]) { printf("%d", f(10)); getchar(); return 0; }
求解斐波那契数列当中的n=5时的值这个问题的递归树如下图所示:
可见递归算法由于会多次计算同样的子问题而出现效率低下的问题,为了避免重复计算子问题,提升算法的效率,可以使用动态规划的思维来改进算法。
二、动态规划算法
1、具有备忘功能的自顶向下算法使用一个数组来记录各个子问题的解,当再一次遇到这一问题的时候直接查找数组来获得解避免多次计算子问题。
#include "stdafx.h" #include <string> using namespace std; int f(int a[],int n) { if (n == 0) { a[0] = 0; return 0; } if (n == 1) { a[1] = 1; return 1; } if (a >= 0) { return a ; } a = f(a, n - 1) + f(a, n - 2); return f(a, n - 1) + f(a, n - 2); } int _tmain(int argc, _TCHAR* argv[]) { int n = 10;//需要求解的数 int* a = (int*)malloc((n + 1)*sizeof(int)); for (int i = 0; i < n + 1; i++) { a[i] = -1; } printf("%d\n子问题的解", f(a, n)); for (int i = 0; i < n + 1; i++) { printf("%d ", a[i]); } getchar(); return 0; }
2、自底向上解决方案
先求解子问题再根据子问题的解来求解父问题,斐波那契数列的子问题图如下:
#include "stdafx.h" #include <string> using namespace std; int f(int a[],int n) { a[0] = 0; a[1] = 1; for (int i = 2; i <= n; i++) { a[i] = a[i - 1] + a[i - 2]; } return a ; } int _tmain(int argc, _TCHAR* argv[]) { int n = 10;//需要求解的数 int* a = (int*)malloc((n + 1)*sizeof(int)); for (int i = 0; i < n + 1; i++) { a[i] = -1; } printf("%d\n子问题的解", f(a, n)); for (int i = 0; i < n + 1; i++) { printf("%d ", a[i]); } getchar(); return 0; }
自底向上的计算方法实现起来非常容易,分析算法,仅从形式上面分析算法可知,算法的时间主要消耗在计算数据规模为n的数组里面的数上面了,所以时间复杂度为O(n)。
相关文章推荐
- 斐波那契数列的递归与非递归算法实现及其时间复杂度
- Fibonacci(斐波那契)数列的递归与非递归实现 python
- 斐波那契数列的递归与非递归实现
- 栈实现斐波那契数列递归过程的非递归模拟
- 斐波那契数列实现--递归,迭代,数组,队列
- C语言斐波那契数列的四种实现方式—递归,迭代,数组,队列
- 斐波那契数列——递归实现
- java递归实现斐波那契数列
- 斐波那契数列的实现(四种方法 递归,非递归)
- 非递归实现斐波那契数列———修改版
- 斐波那契数列的递归,迭代(循环),通项公式三种实现
- OJOJ:斐波那契数列的实现——递归与非递归实现
- Python:斐波那契数列递归实现方法
- 斐波那契数列(Fibonacci)(递归,非递归)(动态规划,自顶向下,自底向上)
- 斐波那契数列的递归实现
- 递归方式、迭代方式实现的斐波那契数列。
- 斐波那契数列的递归实现和非递归实现
- 斐波那契数列-递归-java实现
- 斐波那契数列的递归和非递归实现 —— python
- 递归与非递归实现斐波那契数列