题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
考点:递归和循环
分析:斐波那契数列指的是这样一个数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368。
可以观察到,从第3个数开始,每个数的值都等于前连个数之和。
同时,定义f(0)=0, f(1)=1.
则 f(2)=f(1)+f(0)=1;
f(3)=f(2)+f(1)=2;
... 依次类推,
f(n)=f(n-1)+f(n-2)
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
a = [0, 1, 1]
if n < 3:
return a[n]
for i in range(3, n+2): //这里n为n+1不明白为什么,如果写n则测试用例过不了,报错列表索引超出范围
a.append(a[i-1] + a[i-2])
return a[n]
一开始用了这种写法:
class Solution:
def Fibonacci(self, n):
# write code here
if n < 0:
return -1
elif n == 0:
return 0
elif n == 1:
return 1
else:
return self.Fibonacci(n-1) + self.Fibonacci(n-2)
但是由于时间限制为1秒,这种写法运行超时。
原因是:重复计算,而且重复的情况还很严重,举个例子,n=4,看看程序怎么跑的:
Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
= Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
= Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
由于我们的代码并没有记录Fibonacci(1)和Fibonacci(0)的结果,对于程序来说它每次递归都是未知的,因此光是n=4时f(1)就重复计算了3次之多。
所以运行超时了。