2017-01-12 2 views
0

Это один ведет себя, как задумано, даже с 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

ответ

2

Вы создали автономное выражение, которое эффективно ничего не делает.

if (depth < 0) 
    false 

Это будет оцениваться в AnyVal (так как нет другого филиала), а затем выбросить. balanceR здесь не возвращается. Вы, вероятно, предназначались для второй ветки if как else if.

+0

Хмм, это похоже на то, что я не понимаю, как вернулась Скала. Я думал, что когда он увидит один оператор после if-statement, он вернет это утверждение. Как я не могу сказать: 'return balanceR (chars.tail, depth + 1)' –

+0

Ваше предложение исправляет проблему. Эквивалентно я мог бы сказать 'return false' после' if' (который, как я думал, был неявным), или изменить вторую ветку как 'else if', как вы предполагали, правильно? –

+1

@TaylorKline Scala возвращает результат последнего оператора в методе. Любое утверждение, которое не находится в конце метода (например, ваше первое, если), просто будет отброшено. Как вы говорите, вы можете использовать возврат здесь, но обычно лучше использовать стиль, чтобы не использовать возврат. – puhlen

Смежные вопросы