我正试图从一本书中学习recusrion,但有些东西对我来说不够清楚。
以下代码
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);
会发生什么任何有关解释和感谢的帮助
答案 0 :(得分: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;
}
您的代码未被混淆。你指的是你没有发布的东西吗?
答案 1 :(得分: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)内部
两者都是相同的 - >返回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);
再次返回f(0,f(1,2,2-1) - > 5,f(1,2,2-1) - > 5 + 2) - >返回5 + 7(x + y) - >答案是12;
答案 2 :(得分: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;
}
致电追踪
阶乘(3)= 3 *阶乘(2)
= 3 *(2 *阶乘(1))
= 3 *(2 *(1 *阶乘(0)))
= 3 *(2 *(1 * 1)))
= 6
简单的递归概述:
“作为递归的简单规则,在以下情况下,可以使用递归例程计算任何函数: 这个功能可以用自己的形式表达出来。 2.存在终止步骤,f(x)对于特定的'x'是已知的点。
因此,要编写任意数量的阶乘的递归程序,我们必须使用上述两个规则以递归形式表示阶乘函数: 1. fact(n)= fact(n-1)* n(阶乘的递归定义)。 2.如果n = 1,则返回1(终止步骤)“