-7

我正在尝试从一本书中学习recursion,但是有些东西对我来说解释得不够清楚。

以下代码

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) 会发生什么;

任何帮助解释和感谢

4

3 回答 3

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

您的代码没有被混淆。你指的是你没有发布的东西吗?

于 2013-05-25T11:23:09.640 回答
1

理论上并在纸上做:

f(1,2,2)->return 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);

再次返回 f(0, f(1,2,2-1) -> 5, f(1,2,2-1) ->5+2) -> return 5+7(x+y) -> The答案是 12;

于 2013-05-25T11:27:02.957 回答
1

每次调用时,n 都会递减。因此,如果 n 在第一次调用时为正,则该函数将在内部再次调用 n 次,然后退出。

总体而言,该函数对 x 和 ya 进行有限次数的算术运算。

如果你想学习递归,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

递归的简单概述:

“作为一个简单的递归规则,任何函数都可以使用递归例程来计算,如果: 1. 函数可以用它自己的形式表达。2. 存在一个终止步骤,即 f(x) 已知的点一个特定的“x”。

因此,要为任意数的阶乘编写递归程序,我们必须使用上述 2 条规则以递归形式表示阶乘函数: 1. fact(n) = fact(n-1)*n(阶乘的递归定义)。2.如果n=1,返回1(终止步骤)”

于 2013-05-25T11:30:07.587 回答