【问题标题】:Why isn't this F# code tail-recursive?为什么这个 F# 代码不是尾递归的?
【发布时间】:2015-09-13 22:34:24
【问题描述】:

我正在查看随 Visual Studio 2015 提供的 F#“教程”模板中的代码,我看到了这段代码;我想知道为什么第一个函数不是尾递归的;我想我明白了,但想确认一下:

/// Computes the sum of a list of integers using recursion.
let rec sumList xs =
    match xs with
    | []    -> 0
    | y::ys -> y + sumList ys

/// Make the function tail recursive, using a helper function with a result accumulator
let rec private sumListTailRecHelper accumulator xs =
    match xs with
    | []    -> accumulator
    | y::ys -> sumListTailRecHelper (accumulator+y) ys

第一个不是尾递归的,因为'+'是一个函数并且它的'两个参数首先被评估?因此,实际的评估顺序是:y,然后 sumList ys,然后 +?而在第二种情况下,评估顺序是:accumulator,y,+ 然后 sumListTailRecHelper(..)?

【问题讨论】:

  • 是的,没错。第一个代码示例中的+ 是在非空列表分支中评估的最后一个函数

标签: recursion f# tail-recursion


【解决方案1】:

如果在递归调用返回后无事可做,则调用是尾递归。所以最后一次调用相当于回到函数代码的开头,修改了参数。

在第一个函数中,您仍然需要将y 添加到结果中。

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多