我試圖從一本書中學習recusrion,但有些東西沒有足夠清楚地解釋給我。混淆C遞歸代碼請解釋
下面的代碼
int f(int n, int x, int y)
{
if(n==0) return x+y;
if(y==0) retun x;
return f(n-1,f(n,x,y-1),f(n,x,y-1)+y);
}
如果我叫F(1,2,2)發生什麼事;
任何幫助解釋和感謝
我試圖從一本書中學習recusrion,但有些東西沒有足夠清楚地解釋給我。混淆C遞歸代碼請解釋
下面的代碼
int f(int n, int x, int y)
{
if(n==0) return x+y;
if(y==0) retun x;
return f(n-1,f(n,x,y-1),f(n,x,y-1)+y);
}
如果我叫F(1,2,2)發生什麼事;
任何幫助解釋和感謝
Theoreticaly和在紙做:
F(1,2,2) - >返回F(1-1中,f(1,2,2-1)中,f(1,2,2- -1)+2)然後我們做內部的
兩者都是相同的f(1,2,2-1) - >返回f(0,f(1,2,1-1),f(1 ,2,1-1)+1)再次內部
再次都是相同的 - > return 2(x = 2);所以我們回去
返回f(0,f(1,2,1-1)→2,f(1,2,1-1)→2 + 1)→f(0,2 ,3) - >返回2 + 3(x + y); (0,f(1,2,2-1) - > 5,f(1,2,2-1) - > 5 + 2) - >返回5 + 7(x + y ) - >答案是12;
int f(int n, int x, int y)
{
int result;
if(n==0) {
printf("f(%d, %d, %d) -> %d\n", n, x, y, x+y);
return x+y;
}
if(y==0) {
printf("f(%d, %d, %d) -> %d\n", n, x, y, x);
return x;
}
printf("recursing for f(%d, %d, %d)...\n", n, x, y);
result = f(n-1,f(n,x,y-1),f(n,x,y-1)+y);
printf("f(%d, %d, %d) -> %d\n", n, x, y, result);
return result;
}
代碼未混淆。你是指你沒有發佈的東西嗎?
在每次呼叫時,n遞減。因此,如果n在第一次調用時爲正,則函數將在內部再次調用n次,然後退出。
總的來說,函數對x和y進行有限次數的算術運算。
如果您想學習遞歸,factorial()更容易理解遞歸如何有用。
int factorial(int number)
{
int temp;
if(number <= 1) return 1;
temp = number * factorial(number - 1);
return temp;
}
CALL TRACE
階乘(3)= 3 *階乘(2)
= 3 *(2 *階乘(1))
= 3 *(2 *(1 *階乘(0)))
= 3 *(2 *(1 * 1)))
= 6
簡單遞歸的概述:
「作爲遞歸的一個簡單規則,任何函數都可以使用遞歸例程計算,如果: 1.該函數可以用自己的形式表示。 2.存在終止步驟,f(x)對於特定的'x'是已知的點。因此要編寫任意數的階乘的遞歸程序,我們必須使用以上2條規則以遞歸形式表示階乘函數: 1. fact(n)= fact(n-1)* n (階乘的遞歸定義)。 2.如果n = 1,則返回1(終止步驟)「
也許他們不使用階乘作爲例子,因爲遞歸是計算它的一個可怕的方法。我也看到了pascals三角形作爲例子,這更糟。然而+1很好的解釋。 – Bull
使用調試器,儘管如此,在紙上記錄調用堆棧的註釋。 –
語法錯誤第4行'retun' – user1937198
或者相反,添加打印語句並分析跟蹤。 – zch