1.何为斐波那契数列?
斐波那契数列:1,1,2,3,5,8,13,21,34,55,89…… ,以如下被以递归的方法定义:从第三项开始,每一项都等于前两项之和。
2.用数学公式表示
F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。
3.代码实现
完整代码测试:
运行结果(n数值小的情况):
可是当我们输入50这较大的数字时并没有立刻得出答案(光标闪烁代表正在计算)
直到好一会才算出来一个错误值
同时我们会发现电脑风扇的声音开始变大,当我们打开任务管理器时发现为了计算这第五十个斐波那契数,CPU就被占用了超过10%的资源!!!
CPU:我拉满了,剩下靠你了
当我们n输⼊为50的时候,需要很⻓时间才能算出结果,这个计算所花费的时间,是我们很难接受的,
这也说明递归的写法是⾮常低效的,那是为什么呢?
其实递归程序会不断的展开,在展开的过程中,我们不难看出,在递归的过程中会有重复的计算,然而随着数值越大,重复的次数就会越多,导致计算量变大,效率大幅度降低,同样也时硬件占用变高。我们可以对此进行一个小测试:
运行结果:
我们可以看到采用递归的方式计算第40个斐波那契数时,第3个斐波那契数就被重复计算了39088169次,这样的计算效率是非常低下的。所以计算斐波那契数时,使用递归的方式是十分不明智的,我们就可以考虑采用迭代的方式解决。列如:
我们知道斐波那契数的前两个数是1,然后前两个数相加就是第三个数,那么我们从前往后计算,将后面的值赋值给前面的值,从大到小计算就行了。
代码实现:
用迭代的方式去实现斐波那契数,效率就比递归高出了很多。
递归虽好,但不可过贪,适可而止就好。