python之遞歸

遞歸就是不斷的調用本身示例:
import sys # print(sys.getrecursionlimit()) # 默認最大遞歸限制:1000 # sys.setrecursionlimit(999999999) # 無論數值多大,最多到20963冊


def recursion(n): print(n) recursion(n + 1) recursion(1)遞歸與棧的關係

在計算機中,函數調用時經過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。
因爲棧的大小不是無限的,因此,遞歸調用的次數過多,就會致使棧溢出。

 



遞歸的特色:
  1. 必須有一個明確的結束條件,要不就會變成死循環了,最終撐爆系統
  2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減小
  3. 遞歸執行效率不高,遞歸層次過多會致使棧溢出
def zero(n): n = n // 2
    print(n) if n == 0: return 'Done' zero(n) print(n)  # 1 2 5


''' 第一層會n=5,第二層會n=2,第三層會n=1,第四層n=0,符合條件程序中止。中止以後,程序的控制權會回到第三層調用第四層的位置,也就是zero(n),而後print出1,而後回到第二層print出2,最後回到第一層print出5。 整個程序是先一層層進去,而後在一層層出來。 ''' zero(10)  # 5 2 1 0 1 2 5

圖示:python

 

 

階乘
n! = n * (n-1)
def factorial(num): if num == 1: return 1
    return num * factorial(num - 1) print(factorial(10))

 

二分查找
data_set = list(range(101)) def b_search(num, low, high, data): mid = int((low + high) / 2) if low == high: print('cannot find it ') return if data[mid] > num: b_search(num, low, mid - 1, data) elif data[mid] < num: b_search(num, mid + 1, high, data) else: print('find it', data[mid]) b_search(33, 0, len(data_set), data_set)

尾遞歸優化
執行完一層調用下一層的時候,把這一層的數據給銷燬掉,而且下一層和這一層沒有關係,叫尾遞歸。
階乘不是尾遞歸 return num * factorial(num - 1) 由於num還在等着factorial(num - 1)的結果。
def cal(n): print(n) return cal(n + 1)  # 雖然這用的是尾遞歸優化,可是python不支持尾遞歸優化,C語言和JS支持。
 cal(1)
相關文章
相關標籤/搜索