【leetcode 66题 之 10 斐波那契数列】

简单介绍一下, 斐波那契数列如下:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........

规律(F代表斐波那契数列函数):

当 n <= 0 时 F = 0

当 n == 1 时 F = 1

当 n > 1时 F = F(n - 1) + F(n - 2)

图示:

【leetcode 66题 之 10 斐波那契数列】_第1张图片

本文使用递归方法和非递归方法两种方法实现:

递归方法:

按上述伪代码所示:

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        if(n <= 0):
            return 0
        elif(n == 1):
            return 1
        else:
            return self.Fibonacci(n - 1) + self.Fibonacci(n - 2)

if __name__ == '__main__':
    import datetime
    start = datetime.datetime.now()

    s = Solution()
    print s.Fibonacci(39)

    end = datetime.datetime.now()
    print str((end - start).seconds) + 'seconds'

输出:

63245986
30 seconds

递归方法:

优点:代码简洁

缺点:效率低,占用资源大。每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而往栈里压入数据及弹出数据都需要时间。

非递归方法:

使用循环的方法实现:

class Solution:
    def Fibonacci(self, n):
        if n <= 0:
            return 0
        if n == 1:
            return 1
        preNumber = 0
        beNumber = 1
        Fsum = 0
        for i in range(2,n+1):
            Fsum = preNumber + beNumber
            preNumber = beNumber
            beNumber = Fsum
        return Fsum

if __name__ == '__main__':
    import datetime
    start = datetime.datetime.now()

    s = Solution()
    print s.Fibonacci(39)

    end = datetime.datetime.now()
    print str((end - start).seconds) + ' seconds'

输出:

63245986
0 seconds

明显看出,循环的方法要比递归的方法快。

斐波那契数列在动态规划中有广泛的应用,掌握斐波那契数列的基本原理和计算方法是基础。

你可能感兴趣的:(剑指offer)