您好,登錄后才能下訂單哦!
python函數遞歸是什么?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
在一個函數體內調用它自身,被稱為函數遞歸。函數遞歸包含了一種隱式的循環,它會重復執行某段代碼,但這種重復執行無須循環控制。
例如有如下數學題。己知有一個數列:f(0) = 1,f(1) = 4,f(n + 2) = 2*f(n+ 1) +f(n),其中 n 是大于 0 的整數,求 f(10) 的值。這道題可以使用遞歸來求得。下面程序將定義一個 fn() 函數,用于計算 f(10) 的值。
def fn(n) : if n == 0 : return 1 elif n == 1 : return 4 else : # 函數中調用它自身,就是函數遞歸 return 2 * fn(n - 1) + fn(n - 2) # 輸出fn(10)的結果 print("fn(10)的結果是:", fn(10))
在上面的 fn() 函數體中再次調用了 fn() 函數,這就是函數遞歸。注意在 fn() 函數體中調用 fn 的形式:
return 2 * fn(n - 1) + fn(n - 2)
對于 fn(10),即等于 2*fn(9)+fn(8),其中 fn(9) 又等于 2*fn(8)+fn(7)……依此類推,最終會計算到 fn(2) 等于 2*fn(1)+fn(0),即 fn(2) 是可計算的,這樣遞歸帶來的隱式循環就有結束的時候,然后一路反算回去,最后就可以得到 fn(10) 的值。
仔細看上面遞歸的過程,當一個函數不斷地調用它自身時,必須在某個時刻函數的返回值是確定的,即不再調用它自身:否則,這種遞歸就變成了無窮遞歸,類似于死循環。因此,在定義遞歸函數時有一條最重要的規定: 遞歸一定要向已知方向進行。
例如,如果把上面數學題改為如此。己知有一個數列:f(20)=1,f(21)=4,f(n + 2)=2*f(n+1)+f(n),其中 n 是大于 0 的整數,求 f(10) 的值。那么 f(10) 的函數體應該改為如下形式:
def fn(n) : if n == 20 : return 1 elif n == 21 : return 4 else : # 函數中調用它自身,就是函數遞歸 return fn(n + 2) - 2*fn(n + 1)
從上面的 fn() 函數來看,當程序要計算 fn(10) 的值時,fn(10) 等于 fn(12)-2*fn(11),而 fn(11) 等于 fn(13)-2*fn(12)……依此類推,直到 fn(19) 等于 fn(21)-2*fn(20),此時就可以得到 fn(19) 的值,然后依次反算到 fn(10) 的值。這就是遞歸的重要規則:對于求 fn(10) 而言,如果 fn(0) 和 fn(1) 是已知的,則應該采用 fn(n)=2*fn(n-1)+fn(n-2) 的形式遞歸,因為小的一端已知;如果 fn(20) 和 fn(21) 是已知的,則應該采用 fn(n)=fn(n+2)-2*fn(n+1) 的形式遞歸,因為大的一端已知。
遞歸是非常有用的,例如程序希望遍歷某個路徑下的所有文件,但這個路徑下的文件夾的深度是未知的,那么就可以使用遞歸來實現這個需求。系統可定義一個函數,該函數接收一個文件路徑作為參數,該函數可遍歷出當前路徑下的所有文件和文件路徑,即在該函數的函數體中再次調用函數自身來處理該路徑下的所有文件路徑。
總之,只要在一個函數的函數體中調用了函數自身,就是函數遞歸。遞歸一定要向已知方向進行。
關于python函數遞歸是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。