我正在編寫一些代碼來平衡括號,this question被證明對算法最有用。算法轉換爲Scala,看不出爲什麼它不起作用
我以我的第一語言(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實現中做了什麼錯誤?
看上去好像你剛混了案件的' '(''和' ')'':) –
衛生署!謝謝 - 我一直在盯着這段代碼太久:) –
本,如果你張貼作爲答案我認爲你應該被授予聲譽,因爲你第一次來到這裏。 –