在計算機編程裏,遞歸指的是壹個過程:函數不斷引用自身,直到引用的對象已知。
使用遞歸解決問題,思路清晰,代碼少。但是在主流高級語言中(如C語言、Pascal語言等)使用遞歸算法要耗用更多的棧空間,所以在堆棧尺寸受限制時(如嵌入式系統或者內核態編程),應避免采用。所有的遞歸算法都可以改寫成與之等價的非遞歸算法。
漢諾塔問題,是常見可用遞歸解決的問題,不過也有非遞歸的解法。
菲波納契數列可用遞歸定義。
以下為求漢諾塔問題的Pascal程序:
procedure Hanoi(n:integer;x,y,z:char);
begin
if n<>1 then begin
Hanoi(n-1,x,z,y);
writeln(x,n,z);
Hanoi(n-1,y,x,z);
else writeln(x,n,z);
end;
end;
上述程序用接近自然語言的偽代碼可表述如下:
Hanoi 過程 (整型參數n; 字符型參數 x,y,z);
//註:n 代表本步中要處理的盤子數,x,y,z 分別表示 n 號盤子原來所在柱子、經由柱子、目標柱子
開始
如果 n 不為 1 ,那麽:開始
調用 Hanoi 過程 (參數為 n-1,x,z,y);
//註:這壹步表示用本過程方法將剩余 n-1 個盤子從柱子 x 經由柱子 z 移動到柱子 y
輸出 x,n,z; //註:表示將 n 號盤子從 x 移動到 z
調用 Hanoi 過程 (參數為 n-1,y,x,z);
//註:這壹步表示用本過程方法將剩余 n-1 個盤子從柱子 y 經由柱子 x 移動到柱子 z
結束; //以上程序段就完成了把 n 個盤子從柱子 x 經由柱子 y 移動到柱子 z
否則 輸出 x,n,z; //註:若 n 為1 的話本句直接輸出表示將 n 號盤子從 x 移動到 z
結束;