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

圖示:

 

 

階乘
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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM