Haskell 将递归函数转换为尾部递归

Haskell 将递归函数转换为尾部递归,haskell,recursion,Haskell,Recursion,我是新来的哈斯克尔,仍在努力理解一些基本知识。在编写递归函数时,我自然会以递归或尾部递归的方式编写它们,而不会有意识地选择其中一种 我的问题是: 给定任何递归函数,是否有一种简单的方法将其转换为尾部递归 给定一个尾部递归函数,有没有简单的方法将其转换为递归函数 示例函数 addOne [] = [] addOne (x:xs) = (x+1):addOne xs 另外,在编写函数时,有什么简单的方法可以判断尾部递归是否比其他方法更合适 我也是哈斯克尔的新手。从我所读到的内容来看,Haskell

我是新来的哈斯克尔,仍在努力理解一些基本知识。在编写递归函数时,我自然会以递归或尾部递归的方式编写它们,而不会有意识地选择其中一种

我的问题是:

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

  • 给定一个尾部递归函数,有没有简单的方法将其转换为递归函数

  • 示例函数

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

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

    我也是哈斯克尔的新手。从我所读到的内容来看,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已经告诉你的那样,什么都不做,什么都不做(老子)。但是您对递归的定义似乎与常见的定义有所不同,因此您可以告诉我们您的意思。

    “给定一个尾部递归函数,有没有简单的方法将其转换为递归?“–每个尾部递归函数都是自然递归的,不是吗?是的,但这与我的问题无关。编写递归函数和尾部递归函数是两个完全不同的程序(语法上)这可以完成相同的任务。所以一个可以转换成另一个。@Mi:不,尾部递归函数总是递归的,并且函数不是“完全不同的”从它本身来看,无论是在语法上还是在任何其他方面。@Niklas B.我从来没有说过尾部递归函数并不总是递归的,不知道你是从哪里得到的。而且,尾部递归与非尾部递归有着本质的不同。如果有疑问,请在评论之前阅读一些内容,以避免被认为是伪智力。@Mi:啊,现在你是了第一次使用术语“无尾递归”。+1,表示屈尊无用的答案。