簡體   English   中英

遞歸函數的停止條件-Haskell

[英]Stopping condition on a recursive function - 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”。

但是,正如我已經說過的,停止條件太弱或根本不存在。 如果代碼中還有其他流程或可能的優化措施(例如,較少的ifs),請告知。

您的代碼無法處理行短於最大長度的情況。

這在某種程度上被另一個錯誤所掩蓋:將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!"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM