Почему false возвращается в этой функции - PullRequest
0 голосов
/ 26 апреля 2010

В моей программе ниже я установил переменную th как true во втором операторе if Мне любопытно, почему это позже возвращается как false.

public boolean nodeExist(TreeNode Tree, T value){

    boolean th = false;

    if(Tree.getValue()!= null){

        if(value == Tree.getValue()){

            th = true;

        }else{

            if(value.compareTo((T) Tree.getValue()) < 0){

                nodeExist(Tree.getLeft(), value);

            }else{

                nodeExist(Tree.getRight(), value);
            }

        }

    }else{

        th = false;

    }

    return th;

}

Ответы [ 3 ]

5 голосов
/ 26 апреля 2010

Вы, вероятно, смотрите на рекурсивный вызов, который устанавливает th в true. Но когда этот вызов возвращается к вызывающей стороне, , что th все еще имеет значение false, и это затем возвращается. Вам нужно присвоить результат рекурсивного вызова:

        if(value.compareTo((T) Tree.getValue()) < 0){

            th = nodeExist(Tree.getLeft(), value);

        }else{

            th = nodeExist(Tree.getRight(), value);
        }
1 голос
/ 26 апреля 2010

Вы уже получили свой ответ. В будущем, чтобы предотвратить подобные ошибки, лучше просто return значение сразу, если вы можете. МОЖНО иметь несколько return; при правильном использовании он может читать более читаемый код.

public boolean nodeExist(TreeNode Tree, T value){
    if (Tree.getValue() == null) return false;

    if (value == Tree.getValue()) return true;

    if (value.compareTo((T) Tree.getValue()) < 0) {
       return nodeExist(Tree.getLeft(), value);
    } else {
       return nodeExist(Tree.getRight(), value);
    }
}

Смотрите также


Кроме того, я заметил, что вы использовали == вместо equals для сравнения объектов (т. Е. T не может быть примитивным типом). Это редко правильно; equals почти всегда то, что на самом деле предназначено.

Смотри также


Еще один совет по стилю, следуйте соглашению об именах для Java, где имена переменных начинаются со строчной буквы, с заглавной буквы для внутренних слов (так, somethingLikeThis).

Программирование заключается не в том, чтобы все было правильно, а в том, чтобы что-то читалось. Изучите и примите хороший стиль кодирования и следуйте установленным правилам.

0 голосов
/ 26 апреля 2010

В разделе, в котором вы выполняете сравнение, где значение th не установлено. Если это условие выполнено, th никогда не может быть установлен в true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...