
斐波那契数列求法:递推(从前向后计算)、递归(从后向前计算),递归由于重复计算导致计算速度很慢——可以使用记忆化数组解决
#include
using namespace std;
long long num[50] = {1, 1};
int main(){
for(int i = 2; i < 50; ++i ){
num[i] = num[i - 1] + num[i - 2];
}
for(int i = 1; i < 50; ++i){
cout << i << " : " << num[i] << endl;
}
return 0;
}

#include
using namespace std;
long long func(int x){
if(x == 0 || x == 1){
return 1;
}
return func(x - 1) + func(x - 2);
}
int main(){
for(int i = 1; i < 50; ++i){
cout << i << " : " << func(i) << endl;
}
return 0;
}

注意:可以看到这里利用递归法求斐波那契数列在进行到30项时,每一项的运算时间已经达到秒级

递归法中存在的大量重复计算导致递归递归太深、运算速度降低,可以使用记忆数组优化程序
#include
using namespace std;
//1.建立一个记忆化数组,存储计算过程中的中间值
long long num[50];
long long func(int x){
if(x == 0 || x == 1){
return 1;
}
//2.num[x] != 0,发现该数字之前已经计算过,直接返回数值
if(num[x] != 0){
return num[x];
}
//3.num[x] == 0,发现该数字之前没有计算过,进行计算并存入记忆化数组中
return num[x] = func(x - 1) + func(x - 2);
}
int main(){
for(int i = 1; i < 50; ++i){
cout << i << " : " << func(i) << endl;
}
return 0;
}

递推 ≈ 递归 + 记忆化数组,由于还有一个调用函数栈的过程只能是约等于