为什么我的递归会通过?

时间:2016-05-12 19:12:43

标签: java recursion

我的递归功能在我的程序中失败了。我正在制作一个方法,构造一个相对简单的对象数组并用特定值填充它们。即,对象1具有这些值3,2,5,6,7,对象2具有这些值; 4,5,6,4,5。等等

当我有方法的不同部分对函数执行不同的操作时,递归就会出现。如下图所示:

$query = "SELECT * 
          FROM business_contacts bc
          INNER JOIN internships i ON bc.id_business = i.id_supervisor_internship 
          WHERE internships.name_enterprise_internship = '$name_enterprise'";  

当我检查我的返回值时,我得到一个0.我在该方法中实际做的事情与我的递归函数无关,并且函数IS在它应该跳转到的最后它会诅咒终止条件。根据我的理解,问题是我格式化递归函数的方式。

下面是实际代码它是一个飞机座椅构造器,为飞机座椅提供价值,就像它被占用等等。上面的内容更容易阅读,但如果我的语法不正确,也可能是问题。

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。

2 个答案:

答案 0 :(得分:3)

在你的代码中,无论你做什么递归,事实上,无论你做什么计算都不会计算,因为你最后为所有情况返回0但是基数为1(你返回1)。 / p>

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)
        }
    }
}

希望这有帮助。

然而,仔细查看您的代码,我认为您通过递归替换序列。我会按座位类重构(即划分代码)你的功能,然后拨打所需的电话。在代码中 at 不需要递归。见下文:

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 );

正如你所看到的那样容易得多(除非我错过了一些大事)。

答案 1 :(得分:2)

让我们说这个

objectConstructor(object foo, 1);

返回1.

之后你做return 0。当然整件事将会返回0。

也许你应该

return objectConstructor(object foo, 1);