2013-05-25 130 views
-7

我試圖從一本書中學習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)發生什麼事;

任何幫助解釋和感謝

+6

使用調試器,儘管如此,在紙上記錄調用堆棧的註釋。 –

+0

語法錯誤第4行'retun' – user1937198

+1

或者相反,添加打印語句並分析跟蹤。 – zch

回答

1

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;

4
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; 
} 

代碼未混淆。你是指你沒有發佈的東西嗎?

+0

-1沒有評論說它做了什麼。 – Bull

+3

@ user2151446你是對的,我沒有給他一條魚。相反,我向他展示瞭如何釣魚。 – mah

1

在每次呼叫時,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(終止步驟)「

+0

也許他們不使用階乘作爲例子,因爲遞歸是計算它的一個可怕的方法。我也看到了pascals三角形作爲例子,這更糟。然而+1很好的解釋。 – Bull