我們學習了函式的巢狀呼叫,可以在函式中呼叫函式。那麼,如果在乙個函式中,呼叫自己這個函式,那麼,這個執行過程稱為:函式遞迴呼叫。這個函式也稱為:遞迴函式。程式測試例子:
程式執行結果如下:
在這個測試例子中,我們定義了func函式,在func函式中又呼叫了func函式自己;所以,這個過程稱為:遞迴呼叫。
我們知道,在程式的執行過程中,碰到函式呼叫的時候,就跳轉到函式定義的函式體中執行,那麼,函式的遞迴呼叫。就是函式又跳轉到自己定義的函式體中執行;那麼,我們分析上面例子中,函式的遞迴呼叫執行過程:
(1) 程式從main函式開始,執行到func(3);**,就跳轉到func函式中執行;
(2) 執行func(3);**,就是把實參3數值,傳遞給形參變數x;然後,執行x--;形參變數x的值變為2;接著執行if(x <= 0)判斷,由於變數x的值等於2,大於0,所以,沒有執行return語句,繼續執行:
printf(
"x = %d\n"
, x);
func(x);
此時,輸出除錯資訊,然後,執行func(x);**,就是在func函式中呼叫func函式,就是遞迴呼叫,由於x變數值為2,相當於執行func(2);**。
(3) 執行func(2);**,把實參2數值傳遞個形參變數x,然後,執行x--;形參變數x的值變為1;接著執行if(x <= 0)判斷,由於變數x的值等於1,大於0,所以,沒有執行return語句,繼續執行:
printf(
"x = %d\n"
, x);
func(x);
此時,輸出除錯資訊,然後,執行func(x);**,遞迴呼叫,由於x變數值為1,相當於執行func(1);**。
(4) 執行func(1);**,把實參1數值傳遞個形參變數x,然後,執行x--;形參變數x的值變為0;接著執行if(x <= 0)判斷,由於變數x的值等於0,所以,執行return語句,結束func(1)函式呼叫。
(5) 結束func(1)函式呼叫,就返回到func(2)的呼叫,func(2)函式執行結束之後,返回到func(3)函式的呼叫;
(6) 最後,func(3)函式呼叫結束,就返回到main函式中繼續執行。
那麼,這個函式遞迴呼叫的過程,可以總結成如下圖:
可以看到,函式的呼叫呼叫流程如下:
func(3) à func(2) à func(1)
那麼,當呼叫到func(1)的時候,進入func函式,執行x--語句,變數x的值變為0,然後,判斷if(x <= 0)語句,由於 x<=0 表示式的值為真,所以,執行return語句,結束func(1)函式的呼叫。
結束func(1)函式的呼叫之後,返回到func(2)函式,然後,執行:
printf(
"call end, x = %d\n"
, x);
輸出 call end, x = 2 語句,就是說明返回到func(2)函式的呼叫中。然後,結束func(2)函式的呼叫之後,返回到func(3)函式。結束func(3)函式呼叫之後,就返回到man函式中。
注意:遞迴函式就是重複呼叫自己的函式。那麼,函式不可以無限地呼叫自己,否則,出現函式棧呼叫異常。所以,遞迴呼叫的函式,應該有結束遞迴呼叫的時候。例如上面測試的例子中,func函式遞迴呼叫,會判斷變數x,如果 if(x <= 0)判斷成立,則執行return語句,退出函式執行,不再遞迴呼叫func函式。這樣,就結束了函式的遞迴呼叫。
函式的遞迴呼叫
乙個函式在它的函式體內呼叫它自身稱為遞迴呼叫。這種函式稱為遞迴函式。c語言允許函式的遞迴呼叫。在遞迴呼叫中,主調函式又是被調函式。執行遞迴函式將反覆呼叫其自身。每呼叫一次就進入新的一層。例如有函式f如下 int f int x 這個函式是乙個遞迴函式。但是執行該函式將無休止地呼叫其自身,這當然是不正...
函式呼叫與遞迴
遞迴,就是遞迴的呼叫自己,直到滿足結束條件並返回。這是大部分材料對遞迴的定義,從程式上看也符合一般的觀感。但是,不了解函式的呼叫過程,對這句話的理解還是會模糊不清的。函式是怎麼呼叫自己,又是如何返回的?下面是常用來說明遞迴呼叫的例子 遞迴求n的階乘n int factorial int n 遞迴是程...
函式的遞迴呼叫
遞迴函式 呼叫自己本身的函式叫遞迴函式 實現如下 main.c define crt secure no warnings include include 遞迴列印字串逆序 int reverse char str if str 0 判斷遞迴結束條件 reverse str 1 printf c s...