2015-06-14 31 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