日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python:递归输出斐波那契数列

發(fā)布時間:2023/12/2 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python:递归输出斐波那契数列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天學(xué)習(xí)Python的時候做一道練習(xí)題,題目是這樣的:

題目 導(dǎo)入

  • 問題
    有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總對數(shù)為多少?

  • 分析
    簡單的分析了一下,發(fā)現(xiàn)這個問題其實(shí)就是斐波那契數(shù)列問題。
    第一個月兔子對數(shù)為1,
    第二個月兔子對數(shù)還是1,
    第三個月,開始生小兔子啦,那么總的對數(shù)是1+1=2,
    第四個月,老兔子又生了,那么1(最開始的老兔子)+1(第四個月老兔子生的)+1(第三個月老兔子生的)=3
    第五個月,1(1老)+1(第五個月老兔子生)+1(第四個月老兔子生)+1(第三個月老兔子生)+1(第三個月老兔子生的小兔子也生了)=5
    第六個月,1(1老)+1(第六個月老兔子生)+1(第五個月老兔子生)+1(第四個月老兔子生)+1(第三個月老兔子生)+1(第三個月老兔子生的小兔子也生了)+1(第三個月老兔子生的小兔子又生了)+1(第四個月老兔子生的小兔子也生了)=8
    ?
    ?
    ?
    可以發(fā)現(xiàn),每個月的兔子的對數(shù)為 1,1,2,3,5,8,13,?
    因此,經(jīng)過一個簡單的分析,可以看出來,這道題就是考察的斐波那契數(shù)列的。

Python代碼實(shí)現(xiàn)

這個代碼實(shí)現(xiàn)的話,應(yīng)該是有多種實(shí)現(xiàn)方法的。

  • 直接輸出
def rabbit1(n):f1=1f2=1if (n==1 or n==2):return 1else:for i in range(3,n+1):f1,f2=f2,f1+f2return f2
  • 遞歸輸出方式一
    這個斐波那契數(shù)還可以使用遞歸進(jìn)行輸出,就是非常直觀的遞歸計算。
def rabbit2(n):if (n==1 or n==2):return 1else:return rabbit2(n-1)+rabbit2(n-2)
  • 遞歸輸出方式二
    這種方式是把之前算過的斐波那契數(shù)存在字典中,這樣的話遞歸要用的話就直接存取,而不是去重新計算。
def rabbit3(n,rabbits={1:1,2:1}):if n in rabbits:return rabbits[n]res=rabbit3(n-1)+rabbit3(n-2)rabbits[n]=resreturn res

三種方式的討論

對于三種方式而言,都可以直接輸出結(jié)果來。

print(rabbit1(10)) print(rabbit2(10)) print(rabbit3(10))

輸出結(jié)果為:

55 55 55

可以看出來,程序是沒有錯的。
現(xiàn)在n=36,再試一試,
第一種方式結(jié)果

14930352[Finished in 0.3s]

第二種方式結(jié)果為:

14930352[Finished in 4.7s]

第三種方式結(jié)果為:

14930352[Finished in 0.3s]

可以看出來,直接遞歸貌似結(jié)果就差遠(yuǎn)了。而第二種遞歸,把之前的數(shù)據(jù)存起來而不是計算則就要快很多了。
至于第一種方式,是相當(dāng)快得,當(dāng)n很大,依舊可以秒算。比如說n=10000,第一種方式可以計算。而第三種方式就不行了,告訴我不能計算了,報錯。至于為什么還沒有弄明白。

關(guān)于使用Python輸出斐波那契數(shù)列的補(bǔ)充

今天在學(xué)習(xí)python迭代器和生成器,大致記錄一下:
迭代器
迭代是Python最強(qiáng)大的功能之一,是訪問集合元素的一種方式。。
迭代器是一個可以記住遍歷的位置的對象。
迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會后退。
迭代器有兩個基本的方法:iter() 和 next()
字符串,列表或元組對象都可用于創(chuàng)建迭代器:

#import sys # 引入 sys 模塊list=[1,2,3,4] it = iter(list) # 創(chuàng)建迭代器對象 flag=True while True:try:print (next(it))except StopIteration:#sys.exit()flag=False

利用迭代器代替for循環(huán),進(jìn)行列表數(shù)據(jù)的遍歷輸出。

生成器
在 Python 中,使用了 yield 的函數(shù)被稱為生成器(generator)。
跟普通函數(shù)不同的是,生成器是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點(diǎn)理解生成器就是一個迭代器。
在調(diào)用生成器運(yùn)行的過程中,每次遇到 yield 時函數(shù)會暫停并保存當(dāng)前所有的運(yùn)行信息,返回yield的值。并在下一次執(zhí)行 next()方法時從當(dāng)前位置繼續(xù)運(yùn)行。
以下實(shí)例使用 yield 實(shí)現(xiàn)斐波那契數(shù)列:

def iteration_yield(it):flag = True# a=0while flag:try:print(next(it), end=" ")except StopIteration:# sys.exit()flag = False# print(a)def fibonacci(n):a, b, counter = 0, 1, 0while True:if counter > n:returnyield aa, b = b, a + bprint('%d,%d' % (a, b))counter += 1 f = fibonacci(1000) iteration_yield(f)

更多具體的內(nèi)容可以從這個地方學(xué)習(xí)到:

http://www.runoob.com/python3/python3-iterator-generator.html

總結(jié)

以上是生活随笔為你收集整理的Python:递归输出斐波那契数列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。