将递归函数转换为尾递归

时间:2013-02-24 20:35:01

标签: haskell recursion

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

我的问题是:

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

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

  3. 示例函数

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

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

2 个答案:

答案 0 :(得分:2)

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

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

可以写成

addOne xs = map (+1) xs

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

addOne = map (+1)

有些情况下,这些标准功能不太适合,您必须编写自己的递归功能。但是,我相信它们涵盖了90%的情况,你可能会试图实现显式递归。

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

答案 1 :(得分:1)

  

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

没有

  

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

是。什么都不做,没有任何遗骸(老子),正如@Joachim Breitner已经告诉过你的那样。但是你对recursive的定义似乎偏离了常见的定义,所以也许你告诉我们你的意思。

相关问题