2016-09-30 127 views
0

我正在使用scala中的一個小程序來檢查某些表達式i是否相對於括號的打開和關閉正確形成。這是問題here但我自己的程序。括號平衡算法

def balance(chars: List[Char]): Boolean = { 
    def balanced(chars: List[Char], opened: Int, closed: Int): Boolean = { 
    if (chars.isEmpty && opened == closed) true 
    else if (opened < closed) false 
    else { 
    if (chars.head == '(') balanced(chars.tail, opened + 1, closed) 
    if (chars.head == ')') balanced(chars.tail, opened, closed + 1) 
    else balanced(chars.tail, opened, closed) 
    } 
} 
    balanced(chars, 0, 0) 

}

的println(平衡( 「只是(有些(隨機)的句子)。\ n(即不工作)」。toList))

的問題是,例如它不適用於這個例子。我追溯了程序,當我們從遞歸調用返回時,顯然問題出現了,但我無法弄清楚錯誤是什麼。

+0

你是什麼意思,完全與「不工作」?你有輸出嗎? – Zermingore

+0

@Zermingore是,對於println語句,它應該返回true,但它實際上返回false – Rodrigo

+0

你也可以考慮使用組合符解析器(例如ATTO)對於這類問題,雖然這是一個有點矯枉過正這裏。 – Reactormonk

回答

2

else { 
    if (chars.head == '(') balanced(chars.tail, opened + 1, closed) 
    if (chars.head == ')') balanced(chars.tail, opened, closed + 1) 
    else balanced(chars.tail, opened, closed) 
} 

你有兩個獨立的if表達,當你想將它們視爲一個單一的情況下表達。如果chars.head == '('true遞歸調用作出,但結果被忽略,而第二if進行評估。氏s將導致else分支被採用,這有效地忽略了在第一個表達式中找到的(。您可以使用例如match

chars match { 
    case Nil => opened == closed 
    case '('::cs => balanced(cs, opened + 1, closed) 
    case ')'::cs => balanced(cs, opened, closed + 1) 
    case _::cs => balanced(cs, opened, closed) 
} 
+0

這是一個!它也可以解決,否則,如果相反第二,如果。謝謝 – Rodrigo

0

你可以試試下面的代碼可在上面的例子中它爲你的工作也有問題,如果你有「SSS)FFF(」它也給真正所以將錯就錯在邏輯上

def balance(chars: List[Char]): Boolean = { 
    def balrec(chars: List[Char], accr: Int, accl: Int): Boolean = { 
     chars match { 
     case head :: tail => 
      if (head.equals('(')) balrec(tail, accr + 1, accl) 
      else if (head.equals(')') && (accr > accl || accr == 0)) balrec(tail, accr, accl + 1) 
      else balrec(tail, accr, accl) 
     case Nil => if (accr == accl) true else false 
     } 
    } 

    balrec(chars, 0, 0) 
    } 
+0

即使它有效,給出完全不同的代碼也沒什麼意義。 OP通過一個工作示例提供了一個問題的鏈接。這是一個關於他們的代碼出了什麼問題的問題,而不是另一個解決方案的請求。 –

+0

@TheArchetypalPaul它不是另一種解決方案,它與李提到的相同,它不是在相同的情況下,所以我把它放在相同的地方,並給出整體解決方案 –

+0

不,它是完全不同的。參數名稱已更改,案例語句組織嚴密,測試順序不同。 –