【问题标题】:Stopping condition on a recursive function - Haskell递归函数的停止条件 - Haskell
【发布时间】:2015-08-30 07:45:25
【问题描述】:

所以,我有这个功能,旨在对齐左侧的文本而不剪切单词(仅空格)。但是我的问题是我找不到函数的停止条件,它会无限运行。

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 小于最长的单词,那么它会提示错误,否则它会“剪切”空格中的字符串,直到它到达一个非空格字符,然后它会递归调用自己以获取 @987654322 @。我还使用putStr 来避免输出中出现“\n”。

但是,正如我已经说过的,停止条件太弱或不存在。如果代码中还有其他流程或可能的优化(例如less ifs),请告知。

【问题讨论】:

    标签: string function haskell if-statement recursion


    【解决方案1】:

    您的代码无法处理行短于最大长度的情况。

    这在某种程度上被另一个错误所掩盖:n 被递减,直到找到一个空格,然后 f 被递归调用,传递 n 的递减值,有效地将所有后续行限制为当前行的长度行。

    (另外,您可能希望从 s 中删除 n + 1 字符,以便输出中不包含原始空格。)

    您可以通过使用模式来避免 if:

    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!"
    

    【讨论】:

    • 如何解决递归中使用的n的递减值问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2013-10-28
    • 1970-01-01
    • 2011-02-14
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多