Python:递归输出斐波那契数列
今天學習Python的時候做一道練習題,題目是這樣的:
題目 導入
問題
有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總對數為多少?分析
簡單的分析了一下,發現這個問題其實就是斐波那契數列問題。
第一個月兔子對數為1,
第二個月兔子對數還是1,
第三個月,開始生小兔子啦,那么總的對數是1+1=2,
第四個月,老兔子又生了,那么1(最開始的老兔子)+1(第四個月老兔子生的)+1(第三個月老兔子生的)=3
第五個月,1(1老)+1(第五個月老兔子生)+1(第四個月老兔子生)+1(第三個月老兔子生)+1(第三個月老兔子生的小兔子也生了)=5
第六個月,1(1老)+1(第六個月老兔子生)+1(第五個月老兔子生)+1(第四個月老兔子生)+1(第三個月老兔子生)+1(第三個月老兔子生的小兔子也生了)+1(第三個月老兔子生的小兔子又生了)+1(第四個月老兔子生的小兔子也生了)=8
?
?
?
可以發現,每個月的兔子的對數為 1,1,2,3,5,8,13,?
因此,經過一個簡單的分析,可以看出來,這道題就是考察的斐波那契數列的。
Python代碼實現
這個代碼實現的話,應該是有多種實現方法的。
- 直接輸出
- 遞歸輸出方式一
這個斐波那契數還可以使用遞歸進行輸出,就是非常直觀的遞歸計算。
- 遞歸輸出方式二
這種方式是把之前算過的斐波那契數存在字典中,這樣的話遞歸要用的話就直接存取,而不是去重新計算。
三種方式的討論
對于三種方式而言,都可以直接輸出結果來。
print(rabbit1(10)) print(rabbit2(10)) print(rabbit3(10))輸出結果為:
55 55 55可以看出來,程序是沒有錯的。
現在n=36,再試一試,
第一種方式結果
第二種方式結果為:
14930352[Finished in 4.7s]第三種方式結果為:
14930352[Finished in 0.3s]可以看出來,直接遞歸貌似結果就差遠了。而第二種遞歸,把之前的數據存起來而不是計算則就要快很多了。
至于第一種方式,是相當快得,當n很大,依舊可以秒算。比如說n=10000,第一種方式可以計算。而第三種方式就不行了,告訴我不能計算了,報錯。至于為什么還沒有弄明白。
關于使用Python輸出斐波那契數列的補充
今天在學習python迭代器和生成器,大致記錄一下:
迭代器
迭代是Python最強大的功能之一,是訪問集合元素的一種方式。。
迭代器是一個可以記住遍歷的位置的對象。
迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。
迭代器有兩個基本的方法:iter() 和 next()。
字符串,列表或元組對象都可用于創建迭代器:
利用迭代器代替for循環,進行列表數據的遍歷輸出。
生成器
在 Python 中,使用了 yield 的函數被稱為生成器(generator)。
跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用于迭代操作,更簡單點理解生成器就是一個迭代器。
在調用生成器運行的過程中,每次遇到 yield 時函數會暫停并保存當前所有的運行信息,返回yield的值。并在下一次執行 next()方法時從當前位置繼續運行。
以下實例使用 yield 實現斐波那契數列:
更多具體的內容可以從這個地方學習到:
http://www.runoob.com/python3/python3-iterator-generator.html
總結
以上是生活随笔為你收集整理的Python:递归输出斐波那契数列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国家非特备案查询网(国家非特备案)
- 下一篇: 排序算法三:堆排序基本原理以及Pytho