3

私は再帰関数で動作するプログラムに取り組んでいます。

私の問題は、再帰関数の作業が完了し、制御が次の関数に転送され、次の関数の作業が完了した後に再帰関数に戻ることです。

制御を強制的に機能に戻すコードが必要です。プログラムを終了したくありません。

public void function1(a, num)
{
  if(a >= num)
  {
    if(a > num)
      function1(a, num);
    else if(a == num)
    {
      a++;
      function1(a, num)
    }
  }
  else
    function2(a, num)
}

public void function2(a, num)
{
  //print result;
}

を呼び出すたびfunction1に、変数aとでいくつかの変更を行っていますnum。しかし問題は、特定の条件で が呼び出されたときに制御が再びfunction2渡されることです。function1それを防ぐコードを教えてください。私が設計しているタイムテーブルジェネレーターの一部です。

4

4 に答える 4

2

このバージョンの関数はまったく同じように機能します。

public void function1(a, num)
{
    if (a < num)
    {
        function2(a, num);
    }
    else
    {
        function1((a > num) ? a : a + 1, num);
    }
}

public void function2(a, num)
{
    //print result;
}

参考までに:aが渡された場合、それは より大きい場合num、関数は同じ引数 list の効果的な呼び出しで無限に再帰するfunction1(a, num)ため、ハングアップが発生し、最終的にはある時点でスタック オーバーフローが発生することはありません。

于 2012-09-15T11:04:05.860 に答える
2

ベースに戻りたいときはいつでもリターンを置きます

于 2012-09-15T10:55:53.540 に答える
1

次のように変更する必要があります。

public void function1(a,num)
{
    if(a>num)
     {
       //Increment num or decrease a here, otherwise the recursion never ends
       function1(a,num);
       return; //Each time the method does a recursion, it stops to execute itself with
       // a new set of arguments, but when one of them decide it's over, all the 
       // instances of the method will resume one by one, so if you don't return, 
       // it executes the rest of function1.
     }
    else if(a==num) 
     {
       a++; //You probably don't want to do that, this a==num case should be merged
       // with a>num. Can you see why?
       function1(a,num)
       return;
     }
    else
       function2(a,num)
}

public void function2(a,num)
{
 //print result;
}
于 2012-09-15T11:25:31.590 に答える
0

ストレートループを実行しただけの場合は、コードが単純になる可能性があります。

while (a <= num)
{
   function2(a, num);
   a++;
}
于 2012-09-15T22:15:53.070 に答える