2013-11-21 208 views
2

即時通訊Haskell新和不明白如何haskell處理遞歸。我幾個月來一直在研究這個問題,只是不能弄明白。我的項目在幾天內到期,所以我會尋求任何幫助或建議!我的項目描述是有7個「罪犯」,其中三個是「有罪」,我必須隨機展示7個罪犯中的3個,告訴這三個罪犯中有多少人有罪,並詢問用戶是否想猜測誰是有罪的或者直到所有的猜測都正確。我已經想出了大部分其他的東西,我只是停留在如何使用遞歸函數從7中反覆顯示3個隨機數,請求輸入,並檢查它是否正確。Haskell做while循環

好吧,看看你給我的東西,我試圖做一個小函數來嘗試使用遞歸作爲循環練習之前,我把它實現到我的項目,這就是我想出了:

main = do 
    num <- 7 
    print recursion(num) 


let recursion a = do 
    putStrLn "guess my number!" 
    guess <- getLine 

    if a==guess 
     then print "good job" 
      return guess 
     else 
      recursion a 

但即時得到一些解析錯誤的行結束,你能告訴我什麼我做錯了嗎? @stonemetal

+3

到目前爲止你有什麼代碼? Stackoverflow是一個社區來尋求幫助,而不是要求代碼。 – bheklilr

回答

1

遞歸函數應該是簡單的部分。所有你需要做的就是決定何時結束遞歸,然後再次調用該函數,如果該條件不成立的話。

let runGame gameData = do newGameData <- runOneIterationOfGame gameData 
          if gameOver newGameData then 
          return newGameData 
          else 
          runGame newGameData 
+0

感謝您的幫助!.....但是即時通訊尋找更多的解釋,你介意一點細節描述該功能?就像我說的那樣,這個新的也沒有很好的理解它 – Kpholsey

+0

@kpholsey gamedata應該保持所有的狀態,哪些囚犯是有罪的,用戶已經猜到了什麼等runOneIterationOfGame顯示關於隨機3的信息,需要玩家輸入等等。gameOver是一個函數,如果用戶猜測正確,它將返回true。如果用戶猜測正確,那麼我們可以退出遊戲,如果用戶沒有正確猜測,那麼您需要通過調用runGame更新狀態來運行另一次遊戲迭代。無論何時你寫一個遞歸函數尋找兩件事情,遞歸的結束和讓你離它更近一步。 – stonemetal

+0

感謝您的幫助! – Kpholsey