以斐波那契数列的计算为例
它的递推关系式是:f(n)= f(n-1)+ f(n-2)
递推代码
#include<bits/stdc++.h>
using namespace std;
int fib[25];
int main(){
fib[1]=fib[2]=1;
for(int i=3;i<=20;i++)
fib[i]= fib[i-1]+fib[i-2];
cout <<fib[20];
}
递归代码
#include<bits/stdc++.h>
using namespace std;
int cnt=0; //统计执行了多少次递归
int fib (int n){ //递归函数
cnt ++;
if (n == 1 || n == 2) //到达终点,即最后的小问题
return 1;
return fib (n -1) + fib (n -2); //调用自己2次,复杂度O(2n)
}
int main(){
cout << fib(20); //计算第20个斐波那契数
cout <<" cnt="<<cnt; //递归了cnt=13529次
}
优化:记忆法递归
#include<bits/stdc++.h>
using namespace std;
int cnt=0; //统计执行了多少次递归
int data[25]; //存储斐波那契数
int fib (int n){
cnt++;
if (n == 1 || n == 2) {
data[n]=1;
return data[n];
}
if(data[n]!=0) //记忆化搜索:已经算过,就不用再算了
return data[n];
data[n] = fib (n -1) + fib (n -2);
return data[n];
}
int main(){
cout << fib(20); //计算第20个斐波那契数
cout <<" cnt="<<cnt; //递归了cnt=37次。
}