这篇文章以Fibonacci数列计算的递归实现使用动态规划法的优化为例,对动态规划方式所能起到的作用进行说明。
斐波那契数列
斐波那契数列:
f(n) = f(n-1) + f(n-2) (n>1)
f(0) = 1
f(1) = 1
简洁的递归实现
斐波那契的实现非常简单,尤其是使用递归来写,这几乎是递归理解时的一个入门算法,实现示例可能会如下所示:
int fibonacci(int n) {
if(n == 0 || n == 1) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
这样写实际上是有很多限制的,首先它执行不了多少次,n为46的时候就会int型溢出了,但是这并不是这篇文章要纠结的地方,在后面将会重点分析一下其执行效率。
递归执行效率分析
使用clock函数来计算一下n为45的时候所需要的时间,整体示例代码如下所示:
#include <stdio.h>
#include <time.h>
int fibonacci(int n) {
if(n == 0 || n == 1) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
int main() {
int n = 0;
while(~scanf("%d",&n)) {
time_t start_time=0, end_time=0;
start_time=clock();
printf("fibonacci(%d)=%d\n",n,fibonacci(n));
end_time=clock();
printf("Time Used: %f\n",(double)(end_time-start_time)/CLOCKS_PER_SEC)