Операторы 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))
как уже было сказано - выражение состоит из вызовы метода , операторов и т. д. поддерева
(результат поддерева вызова метода) логический оператор (результат поддерева вызова метода)
результатом будет значение оценки выражения.