【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
明显看出,循环的方法要比递归的方法快。
斐波那契数列在动态规划中有广泛的应用,掌握斐波那契数列的基本原理和计算方法是基础。
相关文章推荐
- 【leetcode 66题 之 12 矩阵中的路径】
- [leetcode] 10 Regular Expression Matching
- leetcode 20:Valid Parentheses(15-10-8)
- Leetcode:66. Plus One(JAVA)
- leetcode 66. Plus One
- [LeetCode]66. Plus One
- leetCode(66)-Excel Sheet Column Title
- LeetCode 66. Plus One
- [LeetCode] 66. Plus One ❤
- 面试笔试杂项积累-leetcode 6-10
- LeetCode-66-Plus One(水题/数值计算)-Easy
- leetcode 每日一题 66. Plus One
- 2018.3.12 leetcode打卡 #66 plus one
- Leetcode——66 plusOne
- leetcode题解-121. Best Time to Buy and Sell Stock && 122. Best Time to Buy and Sell St && 66. Plus One
- 【Leetcode 10】Regular Expression Matching
- LeetCode 10 - Regular Expression Matching
- leetcode[66]Plus One
- leetcode 66. Plus One
- leetcode 349. Intersection of Two Arrays(C语言)10