Python-100例(5-6) 排序斐波那契数列
前面分享的四道題目如下:
- Python-100 | 練習(xí)題 01 & 列表推導(dǎo)式
- Python-100 練習(xí)題 02
- Python-100 練習(xí)題 03 完全平方數(shù)
- Python-100 練習(xí)題 04 判斷天數(shù)
這次是分享 Python-100 例的第五和第六題,分別是排序和斐波那契數(shù)列問題,這兩道題目其實(shí)都是非常常見的問題,特別是后者,一般會(huì)在數(shù)據(jù)結(jié)構(gòu)的教程中,講述到遞歸這個(gè)知識(shí)點(diǎn)的時(shí)候作為例題進(jìn)行介紹的。
Example-5 排序
題目:輸入三個(gè)整數(shù) x,y,z,請(qǐng)把這三個(gè)數(shù)由小到大輸出。
思路
考慮令 x 保存最小的數(shù)值,即先令 x 分別和 y,z 作比較,通過比較后,x變成最小值,接著 y 和 z 比較,即可完成排序
代碼實(shí)現(xiàn)
代碼實(shí)現(xiàn)上有兩種,一種就是手動(dòng)實(shí)現(xiàn)排序過程,另一種就是采用內(nèi)置函數(shù)。
def sort_numbers_1():x = int(input('integer:\n'))y = int(input('integer:\n'))z = int(input('integer:\n'))print('input numbers: x=%d, y=%d, z=%d' % (x, y, z))if x > y:x, y = y, xif x > z:x, z = z, xif y > z:y, z = z, yprint('sorted: x=%d, y=%d, z=%d' % (x, y, z))# 利用列表的內(nèi)置函數(shù) sort() def sort_numbers_2():l = []for i in range(3):x = int(input('integer:\n'))l.append(x)print('original list:', l)l.sort()print('sorted:', l)測試樣例如下:
# sort_numbers_1()運(yùn)行結(jié)果 integer: 1 integer: 0 integer: 5 input numbers: x=1, y=0, z=5 sorted: x=0, y=1, z=5# sort_numbers_2() 運(yùn)行結(jié)果 integer: 1 integer: 0 integer: 5 original list: [1, 0, 5] sorted: [0, 1, 5]Example-6 斐波那契數(shù)列
題目:斐波那契數(shù)列
思路
斐波那契數(shù)列(Fibonacci sequence),又稱黃金分割數(shù)列,指的是這樣一個(gè)數(shù)列:0、1、1、2、3、5、8、13、21、34、…
數(shù)學(xué)上的定義如下:
n=0: F(0)=0 n=1: F(1)=1 n>=2: F(n)=F(n-1)+F(n-2)代碼實(shí)現(xiàn)
需要輸出斐波那契數(shù)列的第 n 個(gè)數(shù),實(shí)現(xiàn)方法如下,既可以通過迭代實(shí)現(xiàn),也可以利用遞歸實(shí)現(xiàn):
# 采用迭代循環(huán)實(shí)現(xiàn) def fib1(n):a, b = 1, 1# n 必須大于等于 2for i in range(n - 1):a, b = b, a + breturn a# 遞歸實(shí)現(xiàn) def fib2(n):if 0 < n <= 2:return 1else:return fib2(n - 1) + fib2(n - 2)如果是需要輸出給定個(gè)數(shù)的所有斐波那契數(shù)列,代碼如下:
# 輸出指定個(gè)數(shù)的斐波那契數(shù)列 def fib_array(n):if n == 1:return [1]if n == 2:return [1, 1]fibs = [1, 1]for i in range(2, n):fibs.append(fibs[-1] + fibs[-2])return fibs測試結(jié)果如下:
a1 = fib1(10) a2 = fib2(10) fibs = fib_array(10) print('fib1 result=', a1) print('fib2 result=', a2) print('fib array=', fibs)# 輸出結(jié)果 # fib1 result= 55 # fib2 result= 55 # fib array= [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]另外,這里更推薦采用迭代實(shí)現(xiàn)斐波那契數(shù)列,而不是遞歸做法,主要是遞歸實(shí)現(xiàn)一方面是調(diào)用函數(shù)自身,而函數(shù)調(diào)用是有時(shí)間和空間的消耗,這會(huì)影響效率問題,另一方面是遞歸中很多計(jì)算都是重復(fù)的,它本質(zhì)上是將一個(gè)問題分解成多個(gè)小問題,這些多個(gè)小問題存在相互重疊的部分,也就會(huì)出現(xiàn)重復(fù)計(jì)算的問題。
這里選擇 n=30,計(jì)算兩種方法使用的時(shí)間,結(jié)果如下:
start = time.time() a1 = fib1(30) print('fib1 cost time: ', time.time() - start) print('fib1 result=', a1) start2 = time.time() a2 = fib2(30) print('fib2 cost time: ', time.time() - start2) print('fib2 result=', a2)輸出結(jié)果如下:
fib1 cost time: 0.0 fib1 result= 832040 fib2 cost time: 0.39077210426330566 fib2 result= 832040可以看到遞歸實(shí)現(xiàn)所需要的時(shí)間明顯大于迭代實(shí)現(xiàn)的方法。
因此,盡管遞歸的代碼看上去更加簡潔,但從實(shí)際應(yīng)用考慮,需要選擇效率更高的迭代實(shí)現(xiàn)方法。
小結(jié)
今天分享的兩道題目就到這里,如果你有更好的解決方法,也可以在下方留言,謝謝。
歡迎關(guān)注我的微信公眾號(hào)–機(jī)器學(xué)習(xí)與計(jì)算機(jī)視覺,或者掃描下方的二維碼,大家一起交流,學(xué)習(xí)和進(jìn)步!
往期精彩推薦
Python-100 練習(xí)系列
- Python-100 | 練習(xí)題 01 & 列表推導(dǎo)式
- Python-100 練習(xí)題 02
- Python-100 練習(xí)題 03 完全平方數(shù)
- Python-100 練習(xí)題 04 判斷天數(shù)
機(jī)器學(xué)習(xí)系列
- 機(jī)器學(xué)習(xí)入門系列(1)–機(jī)器學(xué)習(xí)概覽
- 機(jī)器學(xué)習(xí)入門系列(2)–如何構(gòu)建一個(gè)完整的機(jī)器學(xué)習(xí)項(xiàng)目(一)
- 機(jī)器學(xué)習(xí)數(shù)據(jù)集的獲取和測試集的構(gòu)建方法
- 特征工程之?dāng)?shù)據(jù)預(yù)處理(上)
- 特征工程之?dāng)?shù)據(jù)預(yù)處理(下)
- 特征工程之特征縮放&特征編碼
- 特征工程(完)
- 常用機(jī)器學(xué)習(xí)算法匯總比較(上)
- 常用機(jī)器學(xué)習(xí)算法匯總比較(中)
Github項(xiàng)目 & 資源教程推薦
- [Github 項(xiàng)目推薦] 一個(gè)更好閱讀和查找論文的網(wǎng)站
- [資源分享] TensorFlow 官方中文版教程來了
- 必讀的AI和深度學(xué)習(xí)博客
- [教程]一份簡單易懂的 TensorFlow 教程
- [資源]推薦一些Python書籍和教程,入門和進(jìn)階的都有!
- [Github項(xiàng)目推薦] 機(jī)器學(xué)習(xí)& Python 知識(shí)點(diǎn)速查表
總結(jié)
以上是生活随笔為你收集整理的Python-100例(5-6) 排序斐波那契数列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最受IT公司欢迎的50款开源软件
- 下一篇: python文档自动翻译