0

我有一个关于 C++ 的问题。所以我制作了这个程序,它计算所有可能的组合以使用递归(而不是 9 个循环)来解决问题。这是代码的一部分:

int used[9];
nMin=1000;

void Combinations(int index)
    {
      if(index>8)
      {
        return;
      }
      for(int i=k;i<4;i++)
      {
        used[index]=i;
        if (sum<nMin && Check())//Checks the solution
        {
          nMin = sum;
          used[i]=0;
          return;
        }
        else
        {
          Combinations(index+1);
        }
      }
}

每次递归调用返回时,应该重复 4 次的 for 循环重置。换句话说,循环变量设置为 0。这就是它的工作方式,我是否必须存储当前循环变量值,还是有其他方法。

编辑:谢谢你们,提供详细信息和您的答案。代码经过一些调整后工作。

4

2 回答 2

2

int i是一个存在于该函数调用实例的 for 循环上下文中的局部变量。当您对同一个函数进行递归调用时,您将在堆栈上推送该函数调用的全新实例,该实例具有自己的 for 循环和自己的int i变量。它们之间没有任何联系。

如果您希望对函数的所有递归调用共享一个计数器,则需要将其定义为静态变量,并将其定义在 for 循环范围之外,如下所示:

void Combinations(int index)
{
     static int persistentCounter;

这将保持它在递归调用中的价值。

于 2012-05-09T16:35:17.927 回答
2

如果我没看错,你的问题是循环变量是否i会被递归调用保护/保存Combinations

答案是肯定的,循环计数器的值将被保留。原因是范围。每次调用函数时,堆栈都会为i当前调用范围内的新变量创建空间。i这意味着函数调用期间的所有交互都是i为该特定调用创建的。

注意:C/C++ 语言标准没有明确的堆栈概念。这实际上是实现自动存储的一个实现细节。

于 2012-05-09T16:35:45.157 回答