您的位置:首页 > 其它

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

2019-01-08 17:24 225 查看

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

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)

图示:

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

递归方法:

按上述伪代码所示:

[code]# -*- 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'

输出:

[code]63245986
30 seconds

递归方法:

优点:代码简洁

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

非递归方法:

使用循环的方法实现:

[code]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'

输出:

[code]63245986
0 seconds

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: