我刚刚学习 F#,我编写了这个可以工作的函数,但我不完全明白发生了什么,有人可以解释一下吗?
open System.Collections.Generic
let factorials = Dictionary<int, int>()
factorials.Add(1, 1)
let rec factorial n =
if n <= 1 then 1
else
match factorials.TryGetValue(n) with
| true, _ -> n * factorial(n-1)
| false, _ ->
factorials.Add(n, n * factorial(n-1))
n * factorial(n-1)
let a = factorial 9
我的问题是:
- 为什么我需要在错误匹配结束时调用
n * Factorial (n-1)
? - 为什么在真正匹配的
->
后面需要一个表达式?
最佳答案
处理评论:
真正匹配的更常见版本是
|true,result -> result
您需要 ->
之后的位才能实际返回值。
在错误匹配中,您需要通过计算来实际计算阶乘
n * factorial(n-1)
事实上,错误案例的更好版本是
|false, _ ->
let r = n * factorial(n-1)
factorials.Add(n,r)
r
关于recursion - F# 中具有内存功能的递归阶乘函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20532326/