混淆的C递归代码请解释

时间:2013-05-25 11:09:23

标签: c++ c

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

会发生什么

任何有关解释和感谢的帮助

3 个答案:

答案 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(终止步骤)“