找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1873|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

c語言遞歸

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-2-13 02:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
   我們寫程序的時候總有些變量以及對這寫變量執(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(....)!!!

在本程序中就是先把所有東西列出來;在往回計算.

呵呵 ,就是這樣.

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表