Это один ведет себя, как задумано, даже с assert(!balance("())(".toList))
:Почему моя функциональность меняется, перемещая некоторую логику?
def balance(chars: List[Char]): Boolean = {
def balanceR(chars: List[Char], depth: Int): Boolean = {
if (chars.isEmpty)
depth == 0
else if (chars.head == '(') balanceR(chars.tail, depth + 1)
else if (chars.head == ')') {
if (depth == 0) false else balanceR(chars.tail, depth - 1)
}
else balanceR(chars.tail, depth)
}
balanceR(chars, 0)
}
Однако изменение размещения логики «вернуться ложным, если глубина становится отрицательным» вызывает такое же утверждение на провал:
def balance(chars: List[Char]): Boolean = {
def balanceR(chars: List[Char], depth: Int): Boolean = {
if (depth < 0)
false
if (chars.isEmpty)
depth == 0
else if (chars.head == '(') balanceR(chars.tail, depth + 1)
else if (chars.head == ')') balanceR(chars.tail, depth - 1)
else balanceR(chars.tail, depth)
}
balanceR(chars, 0)
}
Почему вторая функция не возвращает false для "())("
, когда рекурсивный вызов, когда chars.head
равен ")"
, должен быть balanceR("(", -1)
?
Обратите внимание, что это от Scala Coursera, и увидеть моды комментария здесь по этой теме: Scala way to program bunch of if's
Хмм, это похоже на то, что я не понимаю, как вернулась Скала. Я думал, что когда он увидит один оператор после if-statement, он вернет это утверждение. Как я не могу сказать: 'return balanceR (chars.tail, depth + 1)' –
Ваше предложение исправляет проблему. Эквивалентно я мог бы сказать 'return false' после' if' (который, как я думал, был неявным), или изменить вторую ветку как 'else if', как вы предполагали, правильно? –
@TaylorKline Scala возвращает результат последнего оператора в методе. Любое утверждение, которое не находится в конце метода (например, ваше первое, если), просто будет отброшено. Как вы говорите, вы можете использовать возврат здесь, но обычно лучше использовать стиль, чтобы не использовать возврат. – puhlen