1. 程式人生 > >理解C語言遞迴函式的逐級返回(return)

理解C語言遞迴函式的逐級返回(return)

遞迴函式,也即呼叫自身的函式。

C Primer Plus中有個例子很棒:

/*理解C語言遞迴函式*/

#include<stdio.h>

void up_and_down(int);

int  main(void)
{
up_and_down(1);
return 0;
}


void up_and_down(int n)
{
printf("level %d: n loacation %p\n", n, &n);/*1*/
if (n < 4)
up_and_down(n + 1);
printf("level %d: n loacation %p\n", n, &n);/*2*/
}

該段程式碼中,up_and_down不斷呼叫自己,輸出如下結果:


相信輸出level1、level2、level3、level4,很好理解,但是為什麼還會輸出level4、level3、level2、level1呢?

原來,在第一次輸出level4之後,函式不再繼續呼叫up_and_down()函式,而是執行return語句,此時第四級呼叫結束,把控制返回給函式的呼叫函式,也就是第三級呼叫函式,第三級呼叫函式中前一個執行過的語句是在if語句中進行第四級呼叫,因此,執行其後續的程式碼,也就是語句#2,這將會輸出level3。第三級呼叫結束後,第二級呼叫函式開始繼續執行,即輸出了level2,以此類推。

為了加深理解,把語句#1註釋掉,結果如下:


只把#2語句註釋掉,結果如下:


根據之前所述執行過程,這兩個結果很容易解釋,程式不能直接返回到main()中的初始呼叫部分,而是通過遞迴的每一級逐步返回。