C++ 遞迴的詳解(一)
這幾天看了一下遞迴
1.遞迴
遞迴:一個物件部分地由它自己組成或定義,稱為遞迴。
遞迴函式:一個函式直接或間接地呼叫自身。
遞迴呼叫:在呼叫一個函式的過程中又出現直接或間接地呼叫該函式本身,稱為函式的遞迴呼叫。
C語言的特點之一就在於允許函式的遞迴呼叫。
2.一般我們什麼時候會用到遞迴呢?
(1)問題本身有遞迴的數學定義。
(2)使用了遞迴的資料結構。
(3)問題本身能夠分解為相同的子問題。
3.遞迴函式
一般來說,遞迴演算法的執行過程分遞推和迴歸兩個階段。
(1)遞推階段 是個不斷簡化問題的階段:把對較複雜問題(規模為n)的求解
轉化為比原問題簡單一些的問題(規模小於n)的求解 。
(2)當遞推到最簡單的不用再簡化的問題時,遞推終止。也就到了迴歸階段。
(3)迴歸階段 是個不斷“求值”的階段:從終止條件開始,一步步返回,直到最終完成整個函式呼叫 。
遞迴函式例子:
int a( int x, int y )
{
if( x == 1 )
f = b( y );
else
f = b( x );
}
int b( int c )
{
int t;
t = c*a( c-1, c+1 );
return t;
}
這裡用到了間接遞迴,函式a()呼叫函式b()時,函式b()有呼叫了函式a()。
連結串列裡的遞迴例子:
struct Link
{
int data;
struct Link *next;
};
void PrintList (struct Link *head)
{
if(head==NULL)
return;
else {
printf(" %d\t", head->data);
PrintList(head->next);
}
}
連結串列在定義的同時也使用了,也使用了剛剛定義的內容。例如struct Link *next;
在定義struct Link的同時,同時也使用了struct Link *next;
這是單鏈表的遞迴。