递归函数如何工作似乎是“无限递归”?

时间:2015-09-13 09:12:52

标签: c recursion

这是从网站上获取的程序的相关部分。

int N, cont[37];

void solve(int n, int sum) {
    if (n == N/2) {
        ++cont[sum];
    } else {
        for (int i=0; i < 10; ++i) solve(n+1, sum+i);
    }
}

int main() {
    N = 4;
    solve(0, 0);
    .....
    return 0;
}

此程序取自网络。递归函数运行良好,但在我看来它是一个无限递归。任何人都可以定义函数的过程吗?

2 个答案:

答案 0 :(得分:3)

每次拨打solve n时,都有两种可能:

  1. n == N/2(在这种情况下为n == 2)。没有递归调用,因此执行返回。

  2. 使用n+1进行了10次通话。

  3. 只要初始n低于N/2,每个来电序列都会一直持续到n到达N/2

答案 1 :(得分:2)

查看此函数的重构版本:

void solve(int n, int sum)
{
  if (n == N/2)
    ++cont[sum]; //function exits without recursive call
  else
  {
    for(int i = 0; i < 10; ++i)
      solve(n+1,sum+1); //recursive call
  }
}

因此递归在solve(N / 2,...)调用结束