4

这些天,我在闲暇时使用 Haskell 进行编程。作为一名 8 年多的命令式语言程序员,我很难围绕一些函数式构造(尤其是折叠)。我正在解决 Euler 项目中的一个问题,并且碰巧产生了以下代码。

f (num, den) s | num*10 < den = s
               | otherwise = f (ratio (num, den) s') s'
               where s' = (s+2)

可以使用折叠或其他一些函数构造来重写这种显式递归吗?我使用折叠的主要障碍是想出阶梯函数。最终我放弃了,求助于递归。

编辑:另外,如何在没有显式递归的情况下将函数中另一个函数返回的输出作为调用函数的输入?

4

1 回答 1

10

总有美好的旧时光until

f = until test func
  where test ((a, b), _) = a * 10 < b
        func (p, s) = (ratio p s+2, s+2)

公平地说,你真的总是会有某种递归,这只是你抽象多少的问题。Haskell 中没有“循环”。

至于您的第二个问题,我相信您刚刚问过“我如何在不进行递归的情况下进行函数调用”。简而言之,你不能,因为那是递归的定义。

until iterate但是,对于像和这样的高阶函数fix(看看那个的实现),您可以避免调用您的工作函数。他们负责在幕后进行显式递归。

于 2013-06-16T20:16:58.270 回答