recursion - 我如何表达阶乘 n!使用 F# 函数,递归还是其他方式?

标签 recursion f# tail-recursion factorial

自然数的阶乘(任何大于或等于 0 的数)是该数乘以其自身的阶乘减一,其中 0 的阶乘定义为 1 .

例如:

0! = 1
1! = 1 * 0!
2! = 2 * 1!
3! = 3 * 2!
4! = 4 * 3!
5! = 5 * 4!

另一种写法是将 1 之间的所有自然数相乘。和 nn! :
5! = 1 * 2 * 3 * 4 * 5

我如何用 F# 中的递归函数来表达这一点?我应该用递归函数来做吗?
//Factorials!
let factorial n = 
    result = ?

最佳答案

如何,选项 1:

let rec factorial n =
    match n with
    | 0 | 1 -> 1
    | _ -> n * factorial(n-1)

如何,选项 2(尾递归,编译成循环):
let factorial n =
    let rec loop i acc =
        match i with
        | 0 | 1 -> acc
        | _ -> loop (i-1) (acc * i)
    loop n 1

应该:不,请参阅我对以下问题的回答:

While or Tail Recursion in F#, what to use when?

我提倡经常避免迭代和递归,以支持高阶函数。但是如果你刚刚开始,也许不要太担心那个建议。 (但请参阅例如@ChaosPandion 的答案,或例如
let factorial n = [1..n] |> List.fold (*) 1

甚至:
let factorial n = [1..n] |> List.reduce (*) // doesn't require the 2nd parameter

关于recursion - 我如何表达阶乘 n!使用 F# 函数,递归还是其他方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4111133/

相关文章:

C++递归地找到水平圆柱体中的最短路径。(递归问题)

algorithm - 多级报表的递归算法

ios - Metal ios 中的递归

javascript - Ecma 脚本 6 : New operator in tail position

javascript - 为什么这个尾调用优化函数失败并出现最大调用堆栈大小超出错误?

algorithm - 使用动态规划的所有可能组合

f# - 如何编写与 Array.sum 兼容的新类型?

arrays - 如何将二维数组传递给 F# 中的函数?

recursion - 将 "almost tail position"中的递归调用移动到真正的尾部位置

f# - .NET Core F# 项目不会写入 TraceSource