Вопрос рекурсии Java - PullRequest
       0

Вопрос рекурсии Java

1 голос
/ 09 апреля 2011

Вот фрагмент кода одного из моих классов:

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 значение true, только если флаги четырех соответствующих объектов на следующем уровне массива также имеют значение true. К сожалению, у меня, похоже, проблемы с этим:

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, которое я должен был получить); Вы не можете сделать несколько вызовов функций в операторе if в Java? или я делаю это неправильно?

(Кстати, извините за форматирование; я впервые здесь пишу)

Ответы [ 2 ]

4 голосов
/ 09 апреля 2011

Операнды && и || являются так называемыми операторами короткого замыкания . Это означает, что логика, в которой они находятся, немедленно прекратит выполнение, если результат известен.

В вашем случае это, вероятно, означает, что результатом первого вызова SomeFunction будет false. Поскольку у вас есть только AND в этой строке, результат больше не может быть true и, следовательно, ваши остальные 3 вызова SomeFunction не будут выполнены.

Итог: измените && на &, это не приведет к короткому замыканию и все вызовы будут выполнены.

2 голосов
/ 09 апреля 2011

Если условие может быть замкнуто, если его результат ясен после первого вызова функции.

...