2016-05-12 18 views
2

私のプログラムでは、私の再帰関数が低下しています。私は、比較的単純なオブジェクト配列を作成し、それらに特定の値を設定するメソッドを作成しています。すなわちオブジェクト1はこれらの値3,2,5,6,7を有し、オブジェクト2はこれらの値を有し、 4,5,6,4,5。等々私の再帰が失敗するのはなぜですか?

私は、関数に異なることをするメソッドの異なる部分があるときに再帰が起こります。下図のように:私は私の戻り値をチェックすると

objectConstructor(Object foo, int switcherVar){ 
    if(switcherVar == 1){ 
     //terminating condition leave method 
     return 1; 
    } else { 
     if(switcherVar == 2){ 
     //do something 
     objectConstructor(object foo, 1) 
     } 
    } 
    return 0; 
} 

は私が実際にこの方法でやっているものは、私の再帰関数とは無関係であると機能がちょうど終わり、それにのろい再IS 0を取得します終了条件にジャンプするはずです。私の理解から、問題は私が再帰関数をフォーマットする方法です。

実際のコードは次のとおりです。飛行機の座席のコンストラクタです。占有されている場合とそうでない場合のように、航空機の座席に値を与えます。上記は読みやすいですが、もし私の構文がオフであれば、それも問題になるかもしれません。

private int airplaneSeatConstructor(Airplane airplane, String className, int numberOfSeats){ 
    /*Airplane Seat Creator, loops through the seats and attaches credentials to them based on the type of plane 
    * being formed.*/ 

    //currently only one plane type. 777. 
    //777 seat number 257 
    //does have a first class section. 
    System.out.println("iteration"); 
    if(className.equals("TERM")){ 
     return 1; 
    }else { 
     if (className.equals("FIRST")) { 
      for (int x = 0; x < numberOfSeats; x++) { 
       airplane.getSeats()[x].setOccupied(false); 
       airplane.getSeats()[x].setFirstClass(true); 
       airplane.getSeats()[x].setBusinessClass(false); 

       if ((x % 4) == 0 || (x % 4) == 3) { 
        airplane.getSeats()[x].setWindowseat(true); 
        airplane.getSeats()[x].setAisleSeat(false); 
       } else { 
        airplane.getSeats()[x].setAisleSeat(true); 
        airplane.getSeats()[x].setWindowseat(false); 
       } 
      } 
      System.out.println("in first"); 
      airplaneSeatConstructor(airplane, "BUSINESS", 40); 
     } 
     if (className.equals("BUSINESS")) { 
      for (int x = 0; x < numberOfSeats; x++) { 
       airplane.getSeats()[airplane.getNumberOfSeatsPerClass()[0] + x].setBusinessClass(true); 
       airplane.getSeats()[airplane.getNumberOfSeatsPerClass()[0] + x].setFirstClass(false); 
       airplane.getSeats()[airplane.getNumberOfSeatsPerClass()[0] + x].setOccupied(false); 
      } 
      System.out.println("in business"); 
      airplaneSeatConstructor(airplane, "ECONOMY", 209); 
     } 
     if (className.equals("ECONOMY")) { 
      for (int x = 0; x < numberOfSeats; x++) { 
       airplane.getSeats()[airplane.getNumberOfSeatsPerClass()[0] + airplane.getNumberOfSeatsPerClass()[1] + x].setBusinessClass(false); 
       airplane.getSeats()[airplane.getNumberOfSeatsPerClass()[0] + airplane.getNumberOfSeatsPerClass()[1] + x].setFirstClass(false); 
       airplane.getSeats()[airplane.getNumberOfSeatsPerClass()[0] + airplane.getNumberOfSeatsPerClass()[1] + x].setOccupied(false); 
      } 
      System.out.println("in economy"); 
      airplaneSeatConstructor(airplane, "SPECIAL", 26); 
     } 
     if (className.equals("SPECIAL")) { 
      System.out.println("in special"); 
      airplaneSeatConstructor(airplane, "TERM", 273); 
     } 
    } 
    return 0; 
} 

私のプリントラインはすべてヒットしましたが、私はまだ戻り値から0を得ています。

答えて

3

をすべきで返しますすべてのケースで0を返しますが、1を返すベースのケースを返します。あなたのプログラムで

objectConstructor(Object foo, int switcherVar){ 
    if(switcherVar == 1){ 
     //terminating condition leave method 
     return 1; 
    } else { 
     if(switcherVar == 2){ 
     //do something 
     objectConstructor(object foo, 1) 
     } 
    } 
    return 0; 
} 

再帰がこのように動作します:あなたが再帰呼び出しの聖霊降臨祭のスイッチャー== 1になるスイッチャー== 2、との最初の呼び出しを行う。しかし、あなたはその結果を破棄し、ちょうど返す0

これを行うための

物事の正しいまたはロジックの方法は、これに似ている:

objectConstructor(Object foo, int switcherVar){ 
    if(switcherVar == 1){ 
     //terminating condition leave method 
     return 1; 
    } else { 
     if(switcherVar == 2){ 
     //do something 
     return objectConstructor(object foo, 1) 
     } 
    } 
} 

この情報がお役に立てば幸いです。

しかし、コードをよく見れば、再帰によってシーケンスを置き換えていると思います。私は、あなたの機能をリファクタリング(すなわち、コードをDivide)し、必要な呼び出しを行います。再帰は必要ありませんすべてあなたのコードです。以下を参照してください。

private void airplaneSeatConstructorFirstClass(Airplane airplane, int numberOfSeats) 
{ 
      for (int x = 0; x < numberOfSeats; x++) { 
       airplane.getSeats()[x].setOccupied(false); 
       airplane.getSeats()[x].setFirstClass(true); 
       airplane.getSeats()[x].setBusinessClass(false); 

       if ((x % 4) == 0 || (x % 4) == 3) { 
        airplane.getSeats()[x].setWindowseat(true); 
        airplane.getSeats()[x].setAisleSeat(false); 
       } else { 
        airplane.getSeats()[x].setAisleSeat(true); 
        airplane.getSeats()[x].setWindowseat(false); 
       } 
      } 
} 

private void airplaneSeatConstructorBussinessClass(Airplane airplane, int numberOfSeats) 
{ 
    for (int x = 0; x < numberOfSeats; x++) { 
       airplane.getSeats()[airplane.getNumberOfSeatsPerClass()[0] + x].setBusinessClass(true); 
       airplane.getSeats()[airplane.getNumberOfSeatsPerClass()[0] + x].setFirstClass(false); 
       airplane.getSeats()[airplane.getNumberOfSeatsPerClass()[0] + x].setOccupied(false); 
      } 
} 

...など。

今、あなただけ呼び出す必要があり:

airplaneSeatConstructorFirstClass(airplane, 80); 
airplaneSeatConstructorBussinessClass(airplane, 40); 

をあなたが見ることができるように(私は大きな何かが欠けていない限り)はるかに簡単です。

+0

私が再帰を使用している唯一の理由は、それをより良く理解することです。あなたのやり方ははるかに理にかなっています。私の思考プロセスは、最初のシート値を設定する機能を1つ持つことでした。これは私のコードの全体的な設計に役立ちました。 – gemini88mill

+0

また、私は最後に私のリターン0を取り除こうとするとき。 Intellijは私にエラーを与えています。 – gemini88mill

+1

IntelliJは関数が整数を返すと述べているので、最後に "return 0"を削除すると言っています。私もコピー&ペーストし、それについては気づいていませんでした。あなたの関数から値を返す必要がない場合は、戻り値の型の代わりに "void"を入れてください。 – Baltasarq

2

はあなたがreturn 0を行う。その後、この

objectConstructor(object foo, 1); 

戻り1.

としましょう。もちろん全部が0

はたぶん、あなたは最終的にしているので、あなたは、実際には、何をするにしても計算は、カウントするつもりはないんどんな再帰、あなたのコードで

return objectConstructor(object foo, 1); 
+0

これは私に正しい結果を与えました:)基本的には、再帰関数が私のような終了値を持っていれば、再帰関数でのreturn文の使用が必要であると言えます。 – gemini88mill

関連する問題