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