剑指Offer_编程题——斐波那契数列
题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
具体要求:
时间限制: C/C++ 1秒,其他语言2秒
空间限制: C/C++32M,其他语言64M
具体思路:
概念介绍
斐波那契数列是一个很经典的问题,大多学计算机的都知道,它是由著名数学家列昂纳多·斐波那契而命名的。它也称之为黄金分割数列。它的由来是从兔子的繁殖而引进来的,因此也称之为“兔子数列”。从第三项起,前两项之和即为第三项,其通项为F(n) = F(n - 1)+ F(n - 2).例如:这样的一个数列:1 1 2 3 5 8 13 21 34……就是斐波那契数列。
实现思路
实现斐波那契数列需要进行经典的算法——递归。但是递归也是有技巧,如果我们只是单纯的进行递归,不进行任何的优化,则时间和空间复杂度为指数级别的,随着n的不断增长,时间的消耗和空间呈爆炸型增长。因此即使我们用递归也要对通项进行优化。其实在计算过程中,我们不难发现,前两项这和为第三项,之所以直接递归有那么大的复杂度,是因为它每计算新的一项,总会重复计算前一项,因此,我们只需要定义一个新的变量来保存这个之前计算好的值,时间和空间复杂度就降下来了。
我们分别用java和python来实现这个思路。
1、我们首先用java来实现这个代码
public
代码效果图如图所示:
2、我们用Python来实现
class
其效果图如图所示:
我们可以通过改善一下以上的代码,适当的缩减代码的运行时间复杂度,当然,空间就比之前的要占用多了,这就是典型的“以空间换时间”的思想。具体改进代码如下:
class
其效果图如图所示:
与上面的代码相比较,只是优化了一行代码,时间复杂度确降低了接近一半,当然与之对应的空间就扩大了将近一倍。
总结
本道题通过一个典型的斐波那契数列问题来考察我们对递归的应用,因此在做该题之前,我们应该了解斐波那契数列,其次要熟练掌握递归思想。在最后我们运用了常见的“以空间换时间”的思想来改进了算法,其效果很明显。继续加油,争取早日找到工作,Good Luck!!!