限制递归深度Haskell

时间:2018-10-18 10:02:37

标签: haskell recursion

我如何限制此递归函数,因此它将最多23次后才停止调用?但是,我不想修改功能binf的定义。

binf :: Double -> [Int]
binf 0 = []
binf x =
  [fromIntegral(truncate x)] ++
  binf(x*2-fromIntegral(truncate x*2))

1 个答案:

答案 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 Onsemcomment link