1. 程式人生 > >C++ 遞迴的詳解(一)

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;

這是單鏈表的遞迴。