2

我是新的 Haskell,仍在尝试了解一些基础知识。在编写递归函数时,我很自然地以递归或尾递归的方式编写它们,而不会有意识地选择其中一个。

我的问题是:

  1. 给定任何递归函数,是否有一种简单的方法可以将其转换为尾递归?

  2. 给定一个尾递归函数,是否有一种简单的方法可以将其转换为递归?

示例函数

addOne [] = []
addOne (x:xs) = (x+1):addOne xs

另外,在编写函数时,有什么简单的方法可以判断尾递归是否比替代方法更合适?

4

2 回答 2

2

我也是 Haskell 的新手。根据我的阅读,Haskell 社区不赞成显式递归。相反,Haskell 鼓励程序员使用标准函数,如mapfilterfoldlfoldr等,它们封装了常见的递归操作。例如,

addOne [] = []
addOne (x:xs) = (x+1):addOne xs

可以写成

addOne xs = map (+1) xs

或者,使用无点样式更进一步,如

addOne = map (+1)

在某些情况下,这些标准函数可能不太适合,您必须编写自己的递归函数。但是,我相信它们涵盖了 90% 的情况,您可能会想要实现显式递归。

我知道这并不能完全回答你的问题,但我希望它能给你一些想法来考虑。

于 2013-02-24T20:52:31.197 回答
1

给定任何递归函数,是否有一种简单的方法可以将其转换为尾递归?

不。

给定一个尾递归函数,是否有一种简单的方法可以将其转换为递归?

是的。正如@Joachim Breitner 已经告诉你的那样,什么都不做,什么都没有做(老子)。但是您的定义recursive似乎与常见的有所不同,所以也许您告诉我们您的意思。

于 2013-02-24T21:47:31.010 回答