web-dev-qa-db-ja.com

括弧バランシングアルゴリズムの再帰

誰かが括弧のバランスの問題のアルゴリズムを私に説明できますか?

「括弧のカップルが一致するため、文字列(コード)構文は正しいですか?」

アルゴリズムがtrueを返すためには、「(」ごとに別の「)」があるはずであるという事実を除けば、それを理解することはできません。

ありがとう!

この解決策を見つけましたが、理解できず、コピーして貼り付けたくありません。

def balance(chars: List[Char]): Boolean = {
    def balanced(chars: List[Char], open: Int): Boolean = {
        if (chars.isEmpty) open == 0
            else
                if (chars.head == '(') balanced(chars.tail,open+1)        
                else
                    if (chars.head == ')') open>0 && balanced(chars.tail,open-1)
                    else balanced(chars.tail,open)
    }      
    balanced(chars,0)
 }
17
user2947615

このコードは、最初の要素のない文字列でbalanced()を呼び出すことにより、文字列に一致する量の開始括弧と終了括弧が含まれているかどうかを再帰的にチェックします。

文字列内の括弧の期待値は、一種のバランスインジケーターに保持されますopen-正は必要な量を示し、負は必要な量を示します '('。初期バランスは0です。

再帰が文字列の終わりに達すると、バランスに問題がないかどうかをチェックします(open == 0)。一致する量の括弧が見られました。

'('が閉じる前に ')'が検出されなかったことを確認するためのチェック(open> 0)もあります。

16
arkonautom