我們寫程序的時候總有些變量以及對這寫變量執(zhí)行操作的代碼,代碼都是一個一個函數(shù)來組織的。我們可以把這些函數(shù)成為功能模塊;更專業(yè)的說法是成為線程.函數(shù)中的變量跟那寫對數(shù)據(jù)執(zhí)行操作的代碼是分別存放在不同的內(nèi)存塊中的:局部變量我們存放在棧,全局變量存放在堆;棧是線成專用的,所以局部變量有局部性,只能在本函數(shù)里操作。在調(diào)用一個方程的時候;要給傳參數(shù),一般的情況是參數(shù)被傳到棧里,然后參數(shù)的下面給方程開辟棧,所以方程能知道參數(shù)壓在哪里。
好知道是這樣以后;我們來寫一個程序使用遞歸來實現(xiàn)N的階乘;
N!=N*(N-1)*(N-2)....*2*1;
程序如下:
#include <stdio.h>
int func(int n)
{
if(n==0) //N是零了嗎?是就返回1.
return 1;
return n*func(n-1); //不是就調(diào)用FUNC(N-1)
}
void main()
{
int n=4;
printf("result is %d",func(n));
}
這里面func(n-1)就是在使用遞歸;
首先第一步在main()里調(diào)用func(n)
此時候參數(shù)為4;
所以不會執(zhí)行return 1;
但參數(shù)4已經(jīng)被壓在它的棧低下面了(參數(shù)壓棧后才到線程的棧底哦)
接著執(zhí)行4*func(3);
但要執(zhí)行本式子的話;但先算出func(3);
所以有去調(diào)用func(3);
參數(shù)3又被壓到棧底下面使用;但這次的棧給上面的棧是不同的;所以上面的參數(shù)4還能保存在;不被破壞.
此時候參數(shù)為3;
所以不會執(zhí)行return 1;
接著執(zhí)行3*func(2);
但要執(zhí)行本式子的話;但先算出func(2);
所以有去調(diào)用func(2);
參數(shù)2又被壓到棧底下面使用;但這次的棧給上面的棧是不同的;所以上面的參數(shù)3還能保存在;不被破壞.
此時候參數(shù)為3;
所以不會執(zhí)行return 1;
接著執(zhí)行2*func(1);
但要執(zhí)行本式子的話;但先算出func(1);
所以有去調(diào)用func(1);
參數(shù)1又被壓到棧底下面使用;但這次的棧給上面的棧是不同的;所以上面的參數(shù)2還能保存在;不被破壞.
此時候參數(shù)為1;
所以不會執(zhí)行return 1;
接著執(zhí)行1*func(0);
但要執(zhí)行本式子的話;但先算出func(0);
所以有去調(diào)用func(0);
這次參數(shù)為0;所以返回1;
返回后;程序運行到哪里?
在哪里調(diào)用就返回到那里!!!
所以返回到func(1)里面的1*func(0);
在func(1)執(zhí)行1*1;后返回.
這次返回到哪里?當然是在哪里被調(diào)用就返回到哪里!!!
所以返回到func(2)里的2*func(1);算出結(jié)果2*1*1.
所以返回2*1*1;
這次返回到哪里?當然是在哪里被調(diào)用就返回到哪里!!!
所以返回到func(3)里的3*func(2);算出結(jié)果3*2*1*1.
所以返回3*2*1*1;
這次返回到哪里?當然是在哪里被調(diào)用就返回到哪里!!!
所以返回到func(4)里的4*func(3);算出結(jié)果4*3*2*1*1.
所以返回4*3*2*1*1;
這次返回到哪里?當然是在哪里被調(diào)用就返回到哪里!!!
所以返回到main()里的printf(....)!!!
在本程序中就是先把所有東西列出來;在往回計算.
呵呵 ,就是這樣.
|