首页 > 解决方案 > 限制递归 Haskell 的深度

问题描述

我怎样才能限制这个递归函数,所以它会在最多 23 次后停止调用?但是,我不想修改函数 binf 的定义。

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

标签: haskellrecursion

解决方案


一般来说,
您可以将递归包装在内部函数中。例如,此函数返回从输入数字开始的递减数字列表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 的结果 - 指定为 initial 的数字rec

在您的情况下
,由于您的递归只是附加到一个列表,并且 haskell 具有延迟评估功能,因此您可以以不同的方式解决此问题:

但是,您可以在这里使用take 23 (binf some_x),因为由于 Haskell 的懒惰,您将停止调用 binf。
- Willem Van Onsem评论链接


推荐阅读