Операторы Java && || in RETURN?

Я смотрю на некоторые примеры алгоритмов Java, и я сталкиваюсь с этим кодом фрагмента в рекурсивном методе:

boolean subTree(TreeNode t1, TreeNode t2) {
    if (t1 == null) {
        return false;
    }
    if (t1.value == t2.value) {
        if (treeMatch(t1, t2))
            return true;;
    }
    return (subTree(t1.left, t2) || subTree(t1.right, t2));
}

Не зная (и никогда не видя)||, используемый в операторе return раньше, не говоря уже о рекурсивном, действительно смутил меня. Я скопировал код в Eclipse, чтобы убедиться, что он действителен, и он был. Затем Я заменил || на&&, и Eclipse, похоже, это не беспокоило. Логически, я понимаю, что этот рекурсивный код должен продолжаться вниз по левый и правый поддеревья TreeNode t1, но я ищу более теоретическое объяснение того, как работает этот синтаксис Java.

может ли кто-нибудь объяснить значение || и && в операторе возврата Java? Что это означает с точки зрения рекурсии? Это имеет смысл только при использовании в сочетании с рекурсией?

7 ответов


как определено в сигнатуре метода, вам нужно будет вернуть boolean. Поэтому после return ключевое слово, вам нужно будет предоставить boolean или выражение, который оценивается в boolean.

в вашем случае у вас есть expession (subTree(t1.left, t2) || subTree(t1.right, t2));, в котором два операнда будут оценены в boolean и вы примените логическое OR на них только если первая оценивает в false. Если первый операнд равен true второго не будет оцениваться и true будет retured.


они работают одинаково, независимо от того, есть ли там рекурсивное утверждение или нет. В твоем выражении:

(subTree(t1.left, t2) || subTree(t1.right, t2))

если первый вызов subTree(t1.left, t2) значение true, второе выражение не будет вызываться или пытаться быть вычисленным. Это просто стандартное поведение короткого замыкания || и && операторы и как операторы работают с любыми аргументами, данными им.


это логический оператор or, который вернет вам логическое значение

 return (subTree(t1.left, t2) || subTree(t1.right, t2))// return boolean value

и && также написали вам логическое значение, например

return (subTree(t1.left, t2) && subTree(t1.right, t2))// return boolean value

оба оператора работают так же, как математическая логика


в Java return возвращает одно значение, определенное телом метода. Если вы думаете об этом как о общей функции (это не так, но это помогает понять), это становится похоже на return(boolean result) в вашем примере. Теперь, как и с любым другим методом, вы можете выполнять встроенные вычисления, которые приводят к промежуточному значению, которое затем пересылается (называется анонимно) к фактической функции, как Math.round(a + 0.5).

объединить, что и

final boolean result = subTree(t1.left, t2) || subTree(t1.right, t2);
return result;

становится

return (subTree(t1.left, t2) || subTree(t1.right, t2));

Ther просто булевы и / или с коротким замыканием.

короткое замыкание означает, что он оценивает первый операнд, а затем оценивает второй только при необходимости, чтобы решить результат. Вы знаете, true / / x = true; false && x = false независимо от значения x, поэтому оно даже не оценивается в этих случаях.

Если оценка имеет побочные эффекты, и вы хотите, чтобы они происходили всегда, то вы должны использовать & или | который не использует короткое замыкание, поэтому оба операнда оцененный.


return (subTree(t1.left, t2) || subTree(t1.right, t2));

оценивает первое предложение subTree(t1.left, t2) затем второй.

таким образом, узел вплоть до листового узла будет оценивать, а затем начнет работать с деревом, работающим с правым узлом (и все это левые узлы).


я объясню это на основании [Спецификация Языка Java] :

оператор return определяется как :

ReturnStatement:
      return Expressionopt ;

оператор return с выражением пытается передать управление вызывающему устройству метода, который его содержит; значение выражение становится значением вызова метода

... выполнение такого оператора return сначала оценивает Выражение.

что выражение:

выражение-это конструкция, состоящая из переменные, операторы, и вызовы метода , которые построены в соответствии с синтаксисом языка, который оценивает одно значение

return (subTree(t1.left, t2) || subTree(t1.right, t2));

давайте де-построить его:

return Expression; //Statement

Expression : (subTree(t1.left, t2) || subTree(t1.right, t2))

как уже было сказано - выражение состоит из вызовы метода , операторов и т. д. поддерева

(результат поддерева вызова метода) логический оператор (результат поддерева вызова метода)

результатом будет значение оценки выражения.