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