【问题标题】:Java recursion questionJava递归问题
【发布时间】:2011-08-01 20:12:18
【问题描述】:

这是我的一个课程中的一段代码:

public void run() {  

    SomeClass[][] someClassArray = new SomeClass[6][];  
    someClassArray[0] = new SomeClass[1];  
    someClassArray[1] = new SomeClass[4];  
    someClassArray[2] = new SomeClass[16];  
    someClassArray[3] = new SomeClass[64];  
    someClassArray[4] = new SomeClass[256];  
    someClassArray[5] = new SomeClass[1024];

    someFunction(0,0); 
}

someFunction(int i, int j) {  
    if(i == 5) {  
        someClassArray[i][j].flag = test(i,j); // BASE CASE  
    }  
    else {  
        if(someFunction(someClassArray(i+1,j*4))  
                && someFunction(someClassArray(i+1,j*4+1))  
                && someFunction(someClassArray(i+1,j*4+2))  
                && someFunction(someClassArray(i+1,j*4+3)))  
            someClassArray[i][j].flag = true;  
        else  
            someClassArray[i][j].flag = false;  
    }  

    return someClassArray[i][j].flag;
}


class SomeClass {  

        boolean flag;  
        // other stuff  
}  

boolean test(int i, int j) {  

        // test some property of this coordinate  
}  

基本上我想要的是仅当下一个数组级别中的四个相应对象的标志也为真时,才将一个 SomeClass 对象的标志设置为真。不幸的是,我似乎遇到了问题:

if(someFunction(someClassArray(i+1,j*4))  
&& someFunction(someClassArray(i+1,j*4+1))  
&& someFunction(someClassArray(i+1,j*4+2))  
&& someFunction(someClassArray(i+1,j*4+3)))  

看起来它只检查第一个条件(我在计数器中添加了所以检查 someFunction 被调用了多少次,它只上升到 6,而不是我应该得到的 1365);您不能在 Java 中的 if 语句中执行多个函数调用吗?还是我做错了?

(顺便说一下格式,这是我第一次在这里发帖)

【问题讨论】:

  • 欢迎来到网络上最好的编程相关论坛 :)
  • someFunction(someClassArray[i+1][j*4]) 与函数签名不匹配
  • 糟糕,我在复制时搞砸了;应该是现在。

标签: java recursion short-circuiting


【解决方案1】:

操作数&&|| 被称为short-circuiting operators。这意味着如果结果已知,它们所在的逻辑将立即停止执行。

在您的情况下,这可能意味着第一次调用SomeFunction 的结果是false。因为您在那条线上只有 AND,所以结果不可能是 true ,因此您对 SomeFunction 的其他 3 次调用不会被执行。

底线:将&& 更改为&,这不会短路,所有调用都会被执行。

【讨论】:

  • @bendicott 如果您喜欢这个答案,请点赞并接受,谢谢!
  • 然而,短路实际上工作正常,通常不应该被移除。
【解决方案2】:

如果条件可以在第一次函数调用中明确的结果被短路。

【讨论】:

  • 这样说好像是if的属性,其实是&&的属性
  • @他叫什么名字:它也是||的一个属性。
猜你喜欢
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多