自然数的阶乘(任何大于或等于 0
的数)是该数乘以其自身的阶乘减一,其中 0
的阶乘定义为 1
.
例如:
0! = 1
1! = 1 * 0!
2! = 2 * 1!
3! = 3 * 2!
4! = 4 * 3!
5! = 5 * 4!
另一种写法是将
1
之间的所有自然数相乘。和 n
为 n!
: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/