剑指offer——斐波那契数列(3)Python实现

本文探讨了斐波那契数列的计算方法,对比了递归与循环两种算法,指出递归方法虽直观但因重复计算导致效率低下,而循环方法通过保存中间结果避免了重复计算,实现了更高效的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:大家都知道斐波那契数列,现在要求输入一个整数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次之多。

所以运行超时了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值