遞歸函數(shù)內(nèi)部的執(zhí)行順序
#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;??
}輸出結(jié)果:
分析:
1) 主函數(shù)調(diào)用fun(1);
2) 此時(shí)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,得到第三行結(jié)果,并將n的新地址抽象為cccc;
7) 判斷,3 < 3不成立,不執(zhí)行遞歸, 直接執(zhí)行第二條輸出語句,即輸出第四行結(jié)果,此時(shí)顯示n的地址為cccc,容易理解;
8) 本層結(jié)束,返回上一層斷點(diǎn)處繼續(xù)執(zhí)行,即n為2的那一層,當(dāng)時(shí)程序去已經(jīng)執(zhí)行遞歸,所以接下來執(zhí)行第二次輸出,即得到第五行輸出結(jié)果,此時(shí)n的地址顯示為bbbb;
9) n為2時(shí)的一層執(zhí)行結(jié)束,返回上一層,即n為1,當(dāng)時(shí)程序去已經(jīng)執(zhí)行遞歸,所以接下來執(zhí)行輸出語句,即得到第六行輸出結(jié)果,此時(shí)n的地址顯示為aaaa;
程序結(jié)束。
總結(jié):
1. 每一級的遞歸都使用它自己的私有的變量n,可以查看地址的值來證明。
2. 每一次函數(shù)調(diào)用都會有一次返回.當(dāng)程序流執(zhí)行到某一級遞歸的結(jié)尾處時(shí),它會轉(zhuǎn)移到前一級遞歸繼續(xù)執(zhí)行。
3. 位于遞歸調(diào)用語句前的語句的執(zhí)行順序和各個(gè)被調(diào)用函數(shù)的順序相同,位于遞歸調(diào)用語句后的語句的執(zhí)行順序和各個(gè)被調(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;
}輸出結(jié)果:





