#includevoid?fun(int?n)?? {?? ????printf("1th?-?Level:?%d??Address:?%dn",?n,?&n);?? ????if(n?<?3)?? ????????fun(n+1);?? ????printf("2th?-?Level:?%d??Address:?%dn",?n,?&n);?? }?? ?? int?main()?? {?? ????fun(1);?? ????return?0;?? }
輸出結果:
分析:
1) 主函數(shù)調(diào)用fun(1);
2) 此時n的值為1,隨即輸出第一行,并得到n的地址并將其抽象為aaaa;
3) 判斷,1 < 3,執(zhí)行遞歸語句, 重新執(zhí)行fun函數(shù);
4) 由于傳遞參數(shù)為n+1,所以本層n的值為2,隨即輸出第二行,并得到n的新地址將其抽象為bbbb;
5) 判斷,2 < 3,執(zhí)行遞歸語句, 重新執(zhí)行fun函數(shù);
6) 同理可得本層n的值為3,得到第三行結果,并將n的新地址抽象為cccc;
7) 判斷,3 < 3不成立,不執(zhí)行遞歸, 直接執(zhí)行第二條輸出語句,即輸出第四行結果,此時顯示n的地址為cccc,容易理解;
8) 本層結束,返回上一層斷點處繼續(xù)執(zhí)行,即n為2的那一層,當時程序去已經(jīng)執(zhí)行遞歸,所以接下來執(zhí)行第二次輸出,即得到第五行輸出結果,此時n的地址顯示為bbbb;
9) n為2時的一層執(zhí)行結束,返回上一層,即n為1,當時程序去已經(jīng)執(zhí)行遞歸,所以接下來執(zhí)行輸出語句,即得到第六行輸出結果,此時n的地址顯示為aaaa;
程序結束。
總結:
1. 每一級的遞歸都使用它自己的私有的變量n,可以查看地址的值來證明。
2. 每一次函數(shù)調(diào)用都會有一次返回.當程序流執(zhí)行到某一級遞歸的結尾處時,它會轉移到前一級遞歸繼續(xù)執(zhí)行。
3. 位于遞歸調(diào)用語句前的語句的執(zhí)行順序和各個被調(diào)用函數(shù)的順序相同,位于遞歸調(diào)用語句后的語句的執(zhí)行順序和各個被調(diào)用函數(shù)的順序相反。
4. 遞歸函數(shù)中必須包含可以終止遞歸調(diào)用的語句來避免死循環(huán)。
帶返回值:
#includeint?fun(int?n) { ????if(n>3) ??????return?n; ????printf("1th?-?Level:?%d??Address:?%dn",?n,?&n); ????int?result?=?fun(n+1); ????printf("2th?-?Level:?%d??Address:?%dn",?n,?&n); ????printf("2th?-?result:?%dn",?result); ????return?n; } int?main() { ????int?result?=?fun(1); ????printf("main?-?result:?%dn",?result); ????return?0; }
輸出結果: