我是新的 Haskell,仍在尝试了解一些基础知识。在编写递归函数时,我很自然地以递归或尾递归的方式编写它们,而不会有意识地选择其中一个。
我的问题是:
给定任何递归函数,是否有一种简单的方法可以将其转换为尾递归?
给定一个尾递归函数,是否有一种简单的方法可以将其转换为递归?
示例函数
addOne [] = []
addOne (x:xs) = (x+1):addOne xs
另外,在编写函数时,有什么简单的方法可以判断尾递归是否比替代方法更合适?
我也是 Haskell 的新手。根据我的阅读,Haskell 社区不赞成显式递归。相反,Haskell 鼓励程序员使用标准函数,如map
、filter
、foldl
、foldr
等,它们封装了常见的递归操作。例如,
addOne [] = []
addOne (x:xs) = (x+1):addOne xs
可以写成
addOne xs = map (+1) xs
或者,使用无点样式更进一步,如
addOne = map (+1)
在某些情况下,这些标准函数可能不太适合,您必须编写自己的递归函数。但是,我相信它们涵盖了 90% 的情况,您可能会想要实现显式递归。
我知道这并不能完全回答你的问题,但我希望它能给你一些想法来考虑。
给定任何递归函数,是否有一种简单的方法可以将其转换为尾递归?
不。
给定一个尾递归函数,是否有一种简单的方法可以将其转换为递归?
是的。正如@Joachim Breitner 已经告诉你的那样,什么都不做,什么都没有做(老子)。但是您的定义recursive
似乎与常见的有所不同,所以也许您告诉我们您的意思。