2013-05-25 102 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