2013-09-22 95 views
-2

這是我的問題:我不明白代碼如何工作。 "())("如何返回false斯卡拉的括號平衡

def balance(chars: List[Char], numOpens: Int): Boolean = { 
    if (chars.isEmpty) { 
    numOpens == 0 
    } else { 
    val h = chars.head 
    val n = 
     if (h == '(') numOpens + 1 
     else if (h == ')') numOpens - 1 
     else numOpens 
    if (n >= 0) balance(chars.tail, n) 
    else false 
    } 
} 
+17

友情提醒:https://www.coursera.org/about/honorcode –

+0

如果這是來自Coursera課程,那麼問這個問題的地方可能在課程的論壇中。如果你想尊重代碼,你應該刪除這個問題。另一方面...我不認爲這個問題是絕密的,並且會危及課程... –

+2

@SebastianN .:這裏的代碼是Coursera課程作業的解決方案。作者要求不要爲他做功課,而是要解釋他在什麼地方找到的解決方案是如何工作的。 – senia

回答

3

線條:

if (n >= 0) balance(chars.tail, n) 
else false 

意味着,如果在任何時候有任何不平衡)字符,false會立即返回(n將被< 0)。對於具體的例子你能給:())(我們可以遵循怎樣n的值變化的函​​數通過字符串的工作原理:

  • 第一個字符 - (:N - > 1,繼續檢查使用剩餘的字符:))(
  • 二字符 - ):N - > 0,則繼續檢查使用剩餘的字符:)(
  • 第三個字符 - ):N - > -1,else觸發 - 立即返回false。第四個字符從不檢查。
3

Shadowlandsanswer是正確的,但我希望你會發現這更示範:

讓我們想象一下,我們都在無限樓梯的頂部上樓梯。並且有一條指令:(表示step down),)表示step up),您應該忽略所有其他說明。

val n = 
    if (h == '(') numOpens + 1 // step down 
    else if (h == ')') numOpens - 1 // step up 
    else numOpens // ignore 

在最後一步之後,我們必須站在頂部樓梯上。否則,指令無效。

if (chars.isEmpty) { 
    numOpens == 0 
} else { ... } 

您不能從頂部樓梯上爬一級,否則指令無效。

if (n >= 0) ... 
else false // there is no stairs upper than the upper one (0) 

實施例:

())(裝置↓↑↑↓。在此部分↓↑之後,您將位於頂部樓梯上方,因此在下一個命令()(n < 0)之後無法加速,因此該指令無效。