递归学习
函数会递归调用自身
需要有退出条件,避免无限自调,导致堆栈溢出,程序崩溃
斐波那契数列
设数列{an}, 若满足a0=0, a1=1,an=an-1+an-2(n>=2)
则称数列{an}为斐波那契数列。
递推公式: a0=0, a1=1,an=an-1+an-2(n>=2)
实现方法1:普通递归实现
int fib(int n)
{
return n < 2 ? n : fib(n-1) + fib(n-2);
}
当n比较大时,会导致两个问题:
1、递归的深度大,耗时长;
2、最终的结果有可能超出int的最大范围
使用局部静态来优化:
对于已计算出来的结果直接返回即可,
不在已计算范围内的,据递推公式从原有基础上递推到n,并保留中间有效计算结果
如果int 类型不满足最大范围,可以将int 改为long long int
int fb(int n)
{
static vector<int> fb{0, 1};
if (n < fb.size()) {
return fb[n];
}
int size = fb.size();
for (int i = size; i <= n; i++) {
fb.push_back(fb[i - 1] + fb[i - 2]);
}
return fb[n];
}
延伸学习
int的上限问题
C/C++如何得到int型最大值
https://blog.csdn.net/wenzishou/article/details/44563387
MIN_INT = (((unsigned int)(-1))>>1)
在32位系统中 2^(32-1) = 2147483647