私は括弧のバランスをとるためにいくつかのコードに取り組んでいます、この質問はアルゴリズムにとって最も有用であることがわかりました。
私はそれを私の第一言語(PHP)で実装しましたが、Scalaを学び、コードを変換しようとしています。
これが私のPHPコードです:
function balanced($string) {
return isBalanced($string, "");
}
function isBalanced($chars, $stack) {
if (!strlen($chars))
return empty($stack);
switch ($chars[0]) {
case '(':
// prepend stack with '(', move to next character
return isBalanced(substr($chars, 1), $chars[0] . $stack);
case ')':
// if '(' seen previously, shift stack, move to next character
return !empty($stack) && isBalanced(substr($chars, 1), substr($stack, 1));
default:
// do nothing to stack, move to next character
return isBalanced(substr($chars, 1), $stack);
}
}
私はこれをテストしました、それは動作します。ただし、Scalaに変換すると、バランスの取れた文字列では失敗します。
私のScalaコード:
object Main {
def balance(chars: List[Char]): Boolean = {
def balanced(chars: List[Char], stack: String): Boolean = {
if (chars.isEmpty)
stack.isEmpty
else if (chars.head == ')')
balanced(chars.tail, chars.head + stack)
else if (chars.head == '(')
!stack.isEmpty && balanced(chars.tail, stack.tail)
else
balanced(chars.tail, stack)
}
balanced(chars, "")
}
}
これが最高のScalaコードではないことを感謝しますが、私は始めたばかりです。いくつかのテスト:
balance("(if (0) false (x))".toList) - fails
balance("profit and loss (P&L).\n(cashflow)".toList) - fails
balance(":)".toList) - passes
balance(")(()".toList) - passes
PHPに相当するものは、これらすべてのテストに合格します。Scalaの実装で何を間違えましたか?