2015-06-14 65 views
0

所以,我有這個功能,旨在對齊左側的文本而不用切詞(只有空格)。然而,我的問題是,我無法找到函數的停止條件,並且它無限。在遞歸函數上停止條件 - Haskell

f n "" = ""   --weak condition 
f n s = if n >= ((maximum . map length . words) s) then if (s !! n == ' ' || s !! n == '\t' || s !! n == '\n') 
                then take n s ++ "\n" ++ (f n (drop n s)) else f (n-1) s 
                else error "Try bigger width!" 

好了,基本上如果n大於最長的字小,然後它會提示錯誤,否則'削減'在白色空間中的字符,直到它到達一個沒有空格字符,然後調用本身遞歸地爲n-1。我也使用putStr來避免輸出中的「\ n」。

但是,正如我所說停止條件太弱或不存在。如果代碼中有其他流或可能的優化(例如,如果更少),請告訴。

回答

3

您的代碼不處理行長度小於最大長度的情況。

這在一定程度上由另一個bug遮蔽:n遞減,直到空白被發現,然後f被稱爲遞歸傳遞的n此遞減的值,從而有效地限制所有後續行到當前行的長度。

(另外,你可能希望從s使原本空白不包含在輸出下降n + 1字符)。

您可以通過使用模式避免IFS:

f n "" = "" -- weak condition 
f n s 
    | n >= (maximum . map length . words) s = 
     if s !! n == ' ' || s !! n == '\t' || s !! n == '\n' 
     then take n s ++ "\n" ++ f n (drop n s) 
     else f (n - 1) s 
    | otherwise = error "Try bigger width!" 
+0

如何解決在遞歸中使用的遞減n值的問題 – user8