java - 为什么我的递归会失败?

标签 java recursion

我的程序中的递归函数失败了。我正在创建一个方法来构造一个相对简单的对象数组并用某些值填充它们。即对象 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。

最佳答案

在你的代码中,无论你做什么递归,事实上,无论你做什么计算都不会起作用,因为你最终对所有情况都返回 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;
}

程序中的递归是这样工作的:您使用 switcher == 2 进行第一次调用,这使得递归调用 while switcher == 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 );

正如你所看到的,这要容易得多(除非我错过了一些大的东西)。

关于java - 为什么我的递归会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37195583/

相关文章:

java - Android:检查麦克风是否收到声音

c++ - 取消链接不删除文件

asp.net-mvc - ASP.NET MVC : Generating multi level menu using recursive helpers

javascript - 从命名空间中使用递归函数时为 "Too much recursion"

java - 在运行时更改类类型

java - Android - 使用已弃用的 API 的危险

java - 无法解析 com.palantir.docker.compose :docker-compose-rule-junit4:0. 32.0

java - 为什么 `Pattern.compile("(? :\u00e9 )",Pattern.CANON_EQ)` throw?

Python 嵌套生成器

Python - 搜索目录树,重命名某些文件