斐波那契数列按照其递推公式可简单写出递归算法:
int fib1(int n) {
if(n == 1 || n == 2)
return 1;
return fib1(n-1)+fib1(n-2);
}
首先是数据范围问题,用long型存储结果数据与用int型同样仅能计算到第46项,第47项开始数据溢出,即便用unsigned long也只能算到47而已。考虑使用字符模拟大整数运算的方法来处理。
其次的运算效率问题,第40项开始已经有明显的等待时间,第46项需等待数秒才能算出结果。
需考虑其他算法。
可以考虑简单的动态规划,开一个数组存储计算过的数据,避免重复运算,可大幅提高效率(即空间换时间),效率接近线性。但递归算法当计算项数很大是会由于递归过深导致递归栈溢出。
直接开数组通过循环进行递推运算可避免递归过深问题: