我试图从一本书中学习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