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