我如何限制此递归函数,因此它将最多23次后才停止调用?但是,我不想修改功能binf的定义。
binf :: Double -> [Int]
binf 0 = []
binf x =
[fromIntegral(truncate x)] ++
binf(x*2-fromIntegral(truncate x*2))
答案 0 :(得分:3)
常规
您可以将递归包装在内部函数中。例如,此函数返回从输入数字x
开始的降序列表。
binf :: Int -> [Int]
binf x = go x 23
where
go :: Int -> Int -> [Int]
go 0 _ = []
go _ 0 = []
go y rec = [y] ++ (go (y-1) (rec-1))
这里,rec
是一个递归计数器,当递归达到0或通过输入为0递归自然结束时,递归结束。
如果运行binf 50
,将得到结果[50, 49, ... , 28]
,其长度为23-指定为初始rec
的数字。
您的情况
由于您的递归只是追加到列表中,并且haskell具有懒惰求值功能,因此您可以采用其他方法解决此问题:
但是,由于Haskell的原因,您可以在这里使用
take 23 (binf some_x)
懒惰,然后您将不再呼叫binf。
-Willem Van Onsem(comment link)