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

for ループは、再帰呼び出しが戻るたびにリセットを 4 回繰り返す必要があります。つまり、ループ変数は 0 に設定されています。それがどのように機能するのか、現在のループ変数の値を保存する必要があるのか​​、それとも別の方法があるのか​​ということです。

編集:詳細な情報と回答をありがとうございます。コードは、いくつかの調整後に機能しました。

4

2 に答える 2

2

int iその関数呼び出しのそのインスタンスの for ループのコンテキスト内に存在するローカル変数です。int i同じ関数を再帰的に呼び出すと、その関数呼び出しの新しいインスタンスがスタックにプッシュされます。スタックには、独自の変数を持つ独自の for ループがあります。それらは決して互いに接続されていません。

関数へのすべての再帰呼び出しでカウンターを共有する場合は、それを静的変数として定義し、次のように 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 に答える