2016-05-12 63 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