递归未终止

Fed*_*edo 2 recursion haskell

我有以下问题。我的目标是实现函数,返回CHARñ次数

GHCi> nTimes 42 3
[42,42,42]
GHCi> nTimes 'z' 5
"zzzzz"
Run Code Online (Sandbox Code Playgroud)

我已经实现了这样的解决方案,但递归并没有结束

nTimes:: a -> Int -> [a]
nTimes a n = a : nTimes a (n-1)
Run Code Online (Sandbox Code Playgroud)

并且函数只是返回一个不可阻挡的数字Chars 提前致谢,

Wil*_*sem 8

为了停止递归,您需要一个base case。不会再次进行递归调用的情况。nTimes但是,您没有基本情况。为什么会nTimes 'z' 0被特殊对待?根据您的程序,这与其他任何情况一样。它将预先a列出,并使用 进行递归调用nTimes a (-1)

因此,您可以实现基本情况,例如使用guard

nTimes:: a -> Int -> [a]
nTimes a n
    | n <= 0 = []
    | otherwise = a : nTimes a (n-1)
Run Code Online (Sandbox Code Playgroud)

所以如果n小于或等于0,我们返回一个空列表。在otherwise情况 ( n > 0) 中,我们因此屈服a,然后以 递归nTimes a (n-1)

如果我们对此进行测试,nTimes 'z' 5我们会得到:

Prelude> nTimes 'z' 5
"zzzzz"
Run Code Online (Sandbox Code Playgroud)

您在这里实现了该replicate :: Int -> a -> [a]函数的“翻转”版本,因此您可以简单地将其编写为nTimes = flip replicate.