1033:斐波那契数列

题目描述

斐波那契数列(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,则循环,用列表前两位的和得出后一位的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值