剑指offer----斐波那契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个整数N,请你输出斐波那契数列的第Ñ项。

N <= 39

一看到这个题目最先想到的解法就是用递归,因为我们在学习Ç语言的时候教材在讲解递归这一知识的时候就是用的这个例子,虽然经常用这个问题来讲解递归函数,但是这不代表递归的解法最适合这道题目,一般在面试的时候,面试官会提示我们上述递归解法有很严重的效率问题并要求我们分析原因。

在剑指提供这本书中给了一个例子,即求F(10),要想求F(10)必须先求F(9)和F(8)。同样要想求F(9)必须要求F(7)和F(8)......一次类推我们可以发现,这其中有很多数我们都是要反复计算求解的,而且随着ñ的增大,计算量会急剧增大。事实上,用递归的方法计算的时间复杂度是以ñ的指数的方式递增的。

比较简单的解法:从下往上计算,先根据F(0)F(1)算出F(2),再由F(1)和F(2)算出F(3).......依此类推就可以直接算出F(N)了,这种算法的时间复杂度是O(N)。

-------------------------下面是我的python代码------------------- -----

class Solution:
    def Fibonacci(self, n):
        # write code here
         if n <= 0:
            return(0)
         elif n == 1or n == 2:
            return(1)
         else:
            a = 1
            b = 1
            for i in range(2,n):
                c = a+b
                a = b
                b = c
            return(c)

------------------------------- python 2 ----------------- ---------------

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        # write code here
        if n==0:
            return(0)
        elif n==1:
            return(1)
        else:
            s = []
            for i in range(n):
                if i==0:
                    s.append(1)
                elif i==1:
                    s.append(1)
                else:
                    s.append(s[i-1]+s[i-2])
        return(s[n-1])

另外,在剑指提供一书中还指出了另外一种时间复杂度更小的解法 o(logn),利用一个数学公式:

有了这个公式,只需我们求得即可得到F(N)那么这个矩阵如何求解呢(利用乘方的性质)。?:


从上面公式中,我们可以看出,相求的Ñ次方,就要先求得的n / 2次方,再把的n / 2次方的结果平方以下即可。这个可以用递归来实现。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值