一.遞歸函數
在函數內部,可以調用其他函數,如果一個函數在內部調用本身,這個函數就是遞歸函數
1.遞歸的基本原理:
- 每一次函數調用都會有一次返回.當程序流執行到某一級遞歸的結尾處時,它會轉移到前一級遞歸繼續執行(調用本身函數)
- 遞歸函數中,位於遞歸調用前的語句和各級被調函數具有相同的順序
- 雖然每一級遞歸有自己的變量,但是函數代碼並不會得到復制
- 遞歸函數中必須包含可以終止遞歸調用的語句
舉例:
>>> def fun2(i): ... r = fun2(i+1) ... return r
遞歸函數中沒有包含終止遞歸調用的語句,此函數將一直返回循環執行下去,加終止條件當滿足條件時會結束函數
def fun(i): print(i) if i == 5: return 5 r = fun(i + 1) return r fun(1)
舉例:
階乘,計算整數n:n!=1*2*3*4*5*..*n
如果用函數fun(n) 可以表示為:
fun(n)=1*2*3*4*5*..*n=fun(n-1)*n
如果用遞歸函數
>>> def fun(n): ... if n == 1: ... return 1 ... return fun(n-1) * n ... >>> fun(2) 2 >>> fun(10) 3628800
舉例:
寫函數,利用遞歸獲取斐波那契數列中的第 10 個數,並將該值返回給調用者
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def fun2(depth, a1, a2): if depth == 10: return a1 a3 = a1 + a2 r = fun2(depth + 1, a2, a3) return r ret = fun2(1,0,1) print(ret)
遞歸小結:
遞歸的目的是簡化程序設計,使程序易讀。
但遞歸增加了系統開銷。 時間上, 執行調用與返回的額外工作要占用CPU時間。空間上,隨着每遞歸一次,棧內存就多占用一截。
二.冒泡排序
冒泡排序一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
冒泡排序算法的運作如下:
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。
- 針對所有的元素重復以上的步驟,除了最后一個。
- 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

例:
li = [22, 12, 33, 21] for i in range(1,len(li)): for j in range(len(li) - i): if li[j] > li[j + 1]: temp = li[j] li[j] = li[j + 1] li[j + 1] = temp print(li)
