我解釋下具體執(zhí)行過程:
創(chuàng)新互聯(lián)公司主營辰溪網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā)公司,辰溪h5成都微信小程序搭建,辰溪網(wǎng)站營銷推廣歡迎辰溪等地區(qū)企業(yè)咨詢
printf("%d!=%ld\n",num,mul(num));
這里調(diào)用了mul(num)方法,第一個值是5,進入方法后,
if(51) x=5*mul(5-1);
這里又調(diào)用了一次方法,
mul(5-1)
這里就是遞歸調(diào)用了,需要把4的值帶入方法又執(zhí)行一次,
變成:if(41) x=4*mul(4-1);
這里又調(diào)用了一次方法,
mul(4-1)
依次類推為:if(31) x=3*mul(3-1);
if(21) x=2*mul(2-1);
這里看懂了沒,遞歸函數(shù)關(guān)鍵字在“遞”和“歸”,相當于循環(huán),一直到條件不滿足時在“歸”,一步步return直到第一個調(diào)用的mul方法。在return主函數(shù)。
也就是從最后一次調(diào)用
mul(2-1)時
n的值為1了,執(zhí)行else語句,結(jié)束“遞”方法操作,return語句,返回X=1,那么接下來變?yōu)?/p>
if(21) x=2*1,返回X=2,接下來變?yōu)椋?/p>
if(31) x=3*2,返回X=6,接下來變?yōu)椋?/p>
if(41) x=4*6,返回X=24,接下來變?yōu)椋?/p>
if(51) x=5*24,返回X=120 結(jié)束遞歸調(diào)用。
希望你能看懂,還有問題在補充吧!
又是你....
首先你和1008一樣又想先把數(shù)據(jù)存起來,再一起處理了....這個思路不對,應(yīng)該是這樣的:
while(數(shù)據(jù)沒結(jié)束){
初始化變量;
讀入數(shù)據(jù);
處理數(shù)據(jù);
輸出結(jié)果;
}
再說這個題,這個題我覺得你想問的是記憶化遞歸要如何記憶。
這題我沒做,看下覺得要么是記憶化遞歸,要么是推導公式。首先你要理解正常的遞歸做這個題要如何做。你現(xiàn)在的做法正是一般的遞歸做法。加入記憶化是這樣:
int dp[21][21][21];
int w(int a,int b,int c)
{
if(dp[a][b][c])return dp[a][b][c];
if(a=0||b=0||c=0)
return 1;
if (a20||b20||c20)
return w(20,20,20);
if (a b b c)
return dp[a][b][c]=w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c) ;
else
return dp[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1, b, c-1)- w(a-1, b-1, c-1) ;
}
即每次做完一個結(jié)果就把這個結(jié)果記錄到對應(yīng)的dp[a][b][c]中,這道題只要a,b,c相同結(jié)果就相同
然后在每次左前檢查這個a,b,c對應(yīng)的結(jié)果算過沒有,算過直接讀,沒算再去算
這和調(diào)用一個函數(shù)一樣啊, 在調(diào)用函數(shù)之前在棧上為形參分配空間, 所以w值存在棧上。。。
#includestdio.h#includestring.h
void?main()
{
void?fun(int?*a,int?index);
void?printIntArray(int?*a);
int?a[100]={1,2,3,4,5};
printIntArray(a);
fun(a,0);
printf("\n");
printIntArray(a);
printf("\n");
}
void?fun(int?*a,int?index)
{
int?tmp;
if(index=100/2)
{
tmp?=?a[index];
a[index]?=?a[100-index-1];
a[100-index-1]?=?tmp;
fun(a,?++index);
}
}
void?printIntArray(int?*a)
{
int?i;
for(i=0;?i100;?i++)
printf("%d?",a[i]);
}