核心概念
遞迴(recursion)
/ rih-KUR-zhun /
遞迴(recursion)是指一個函式透過「呼叫它自己」來解決問題——而且每次呼叫的,都是同一個問題裡更小的一塊。它不寫一個大迴圈,而是說「先處理一小點,剩下的再交回給我」,一遍又一遍,每次咬掉稍微小一點的一口,直到沒什麼可做為止。
想像你排在一條長隊裡,想知道自己排第幾。你看不到隊首,於是拍拍前面那個人問「你是第幾號?」他也不知道,便去問他前面的人,如此一路往前——直到最前面那個人說「我是 1 號。」這個答案再順著隊伍傳回來,每個人加上一,最後傳到你這兒。
讓它不會無限轉下去的關鍵是「基準情形(base case)」:問題最簡單、能立刻給出答案、不再呼叫自己的那個版本。「隊首的人是 1 號」就是基準情形。一旦忘了寫它,函式就會沒完沒了地呼叫自己、最終崩潰——也就是「堆疊溢位(stack overflow)」。每個遞迴都需要兩樣東西:一條讓問題變小的路,和一個停下來的地方。
def factorial(n):
if n == 1: # base case — stop here
return 1
return n * factorial(n - 1) # call itself on a smaller nfactorial(4) 展開成 4 × factorial(3)……一路降到基準情形,再一層層乘回去。
程式設計師的老梗:要理解遞迴,你得先理解遞迴。
又稱
另見