以階乘舉例:
def factorial(n):
""" 階乘 """
if n == 0:
return 1
else:
return n * factorial(n-1)
函式每被呼叫一次就會被壓棧,而且引數減一再次呼叫再次壓棧,當達到終止條件時,遞迴就會終止,從棧底往上返回return的結果。
二分查詢
終止條件
找到終止:目標值等於[mid]的資料
未找到終止:low索引大於high索引
遞迴核心步驟
def binary_search(data, target, low, high):
""" 二分查詢 """
if low > high:
return false
else:
mid = (low + high) // 2
if target == data[mid]:
return true
elif target < data[mid]:
return binary_search(data, target, low, mid-1)
else:
return binary_search(data, target, low + 1, high)
時間複雜度:o(log n)
檔案系統
計算巢狀在乙個特定目錄中的所有檔案和目錄的總磁碟使用情況。
遞迴終止條件
遞迴核心步驟
""" 報告乙個檔案系統磁碟使用情況 """
total = os.path.getsize(path)
if os.path.isdir(path):
for filename in os.listdir(path):
childpath = os.path.join(path, filename)
if disk_usage(childpath):
total += disk_usage(childpath)
print (''.format(total), path)
if __name__ == "__main__":
path = 'c:\\users\\administrator\\desktop\\python學習\\'
disk_usage(path)
時間複雜度:o(n)
結果顯示:
斐波那契數列
def good_fibonacci(n):
""" 斐波那契數列 """
if n <= 1:
return (n,0)
else:
(a, b) = good_fibonacci(n-1)
print (a,b)
return (a+b, a)
if __name__ == "__main__":
print(good_fibonacci(5))
print(good_fibonacci(8))
線性遞迴二路遞迴用二路遞迴計算乙個序列的元素之和:
def binary_sum(s, start, stop):
""" 返回乙個序列的和 """
if start >= stop:
return 0
elif start == stop - 1:
return s[start]
else:
mid = (start + stop) // 2
return binary_sum(s, start, mid) + binary_sum(s, mid, stop)
if __name__ == "__main__":
s = [1,2,3,4,5,6,7,8]
print(binary_sum(s,0,len(s)))
多重遞迴遞迴必須包含的兩個條件:
消除尾遞迴
套,而不是依賴於直譯器,從而把遞迴演算法轉化為非遞迴演算法,
演算法與資料結構 六 之遞迴
定義 程式呼叫自身的程式設計技巧,先遞進,再回歸。它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解 構成遞迴需具備的條件 package com.yan.study.algorithm.queue letcode中煉表的遞迴刪除 param definition for s...
資料結構之遞迴演算法
迭代思想 遞迴事實上就是函式自己呼叫自己,我們先一起看下 的實現,然後再來分析 例如 i 5 的時候,不停地呼叫自身,只有當 i 0,1 時才可以計算結果。在高階語言中,函式呼叫自己和呼叫其他函式並沒有本質的不同。我們把乙個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱作遞迴函式。迭代使...
資料結構與演算法 遞迴
一 概念 遞迴是一種高效 簡介的編碼技巧,一種應用很廣泛的演算法,比如dfs深度優先搜尋,前中後序二叉樹遍歷等都是使用遞迴。方法或函式呼叫自身的方式成為遞迴呼叫,呼叫稱為遞,返回成為歸 所有遞迴問題都可以用遞迴公式來表示 二 遞迴優缺點 優點 簡潔 缺點 堆疊溢位風險 可根據調整遞迴呼叫的最大深度來...