#include<stdio.h>
void testfunc(int);
int main(void)
{
testfunc(1);
return 0;
}
void testfunc(int n)
{
printf("Lv%d:%p\n",n,&n); //%p 地址顯示格式
if(n<4)
{
testfunc(n+1); //testfunc()調(diào)用了自己
}
printf("2Lv%d:%p\n",n,&n);
}
以上是一個(gè)遞歸的示例。
testfunc()在內(nèi)部調(diào)用了自己,這樣的后果是:暫時(shí)不執(zhí)行最后面的“printf("2Lv%d:%p\n",n,&n);”,而是將 n+1作為參數(shù)調(diào)用了自己,這樣重復(fù),最終程序的結(jié)果是:

(根據(jù)電腦不同,地址可能有所不同)
程序具體運(yùn)行步驟:
1.main()調(diào)用testfunc(1)
2.testfunc(1)執(zhí)行,打印“lv1:0022FF60”,0022FF60是n的地址
3.n<4,條件成立, testfunc(1)調(diào)用testfunc(2)
4.testfunc(2)執(zhí)行,打印“lv1:0022FF40”,因?yàn)榇藭r(shí)testfunc(2)的變量n已經(jīng)不是testfunc(1)中的變量n了,所以地址不同。(函數(shù)的參數(shù)作用域只在當(dāng)前函數(shù))
5.n<4,條件成立,testfunc(2)調(diào)用testfunc(3)
6.testfunc(3)執(zhí)行,打印“lv1:0022FF20”
7.n<4,條件成立,testfunc(3)調(diào)用testfunc(4)
8.testfunc(4)執(zhí)行,打印“lv1:0022FF00”
9.n<4,條件不成立,打印“2lv1:0022FF00”
10.返回調(diào)用testfunc(4)的testfunc(3),打印“2lv1:0022FF20”
11.返回調(diào)用testfunc(3)的testfunc(2),打印“2lv1:0022FF40”
12.返回調(diào)用testfunc(2)的testfunc(1),打印“2lv1:0022FF60”
OK,這就是函數(shù)的遞歸調(diào)用,通俗的說(shuō)就是函數(shù)自己調(diào)用自己。以前學(xué)時(shí)沒(méi)有弄明白,現(xiàn)在終于弄明白了。