题目描述
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
现在请你编程计算一下这个数列
已知 f(0) = f(1) = 1, f(n) = f(n - 1) + f(n - 2) (n ≥ 2)。
现在给定一个数 n, 请求出 f(n) 。输出
对于每个输入,输出一行一个数,表示 f(n)。
样例输入
4 1 2 3 4样例输出
1 2 3 5
解答:
这是第一版的代码:
def fun(n):
if n == 0:
return 1
elif n == 1:
return 1
else:
return fun(n-1) + fun(n-2)
n = int(input())
m = []
for i in range(0, n):
m.append(int(input()))
for i in range(0, n):
print(fun(m[i]))
然后会发现,时间超额,问题在于递归会出现冗余的分支。
以fun(4)为例:
fun(2)和fun(1)分别计算了两次,所以我们可以对代码进行优化:
def fun(n):
#用一个额外的列表保存已经计算过的值
record = [1,1]
if n <= 1:
return 1
else:
for i in range(2, n+1):
record.append(record[i - 1] + record[i - 2])
return record[n]
n = int(input())
m = []
for i in range(0, n):
m.append(int(input()))
for i in range(0, n):
print(fun(m[i]))
首先是函数部分:
我们先定义一个列表record,里面存有 f (0) 和 f (1) 的值 。
如果n <= 1, 则返回record[1]
如果n > 1,则循环,用列表前两位的和得出后一位的结果。