2016-05-12 86 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; 
} 

當我檢查我的返回值,我得到一個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(你返回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; 
} 

遞歸程序中的工作是這樣的:你做的第一次調用與切換== 2,這使得遞歸調用絲毫切換== 1,但你放棄這個結果,只是返回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) 
     } 
    } 
} 

希望這有助於。

但是,仔細觀察你的代碼,我認爲你正在用遞歸替換序列。我會通過座位類重構(即劃分代碼)你的功能,並進行必要的調用。在你的代碼中,不需要遞歸在所有的。見下:

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

我使用遞歸的唯一原因是更好地理解它。但你的方式更有意義。我的思考過程是有一個功能來設置初始座位值。謝謝,這有助於我的代碼的整體設計。 – gemini88mill

+0

也,當我嘗試刪除我在結束時返回0。 Intellij給我一個錯誤。 – gemini88mill

+1

IntelliJ抱怨你在最後刪除了「return 0」,因爲你已經聲明你的函數返回一個整數。我也複製和粘貼,並沒有意識到這一點。如果你不需要從你的函數返回值,只需放置「void」而不是返回類型。 – Baltasarq

2

讓我們說,這

objectConstructor(object foo, 1); 

返回1

之後,你做return 0。當然,整個事情將返回0

也許你應該

return objectConstructor(object foo, 1); 
+0

這一個給了我正確的結果:)基本上我們可以說,如果我們的遞歸函數有一個終止值,比如我的,那麼在遞歸函數中使用return語句是必要的。 – gemini88mill