recursion - F# 中具有内存功能的递归阶乘函数

标签 recursion f#

我刚刚学习 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

我的问题是:

  1. 为什么我需要在错误匹配结束时调用 n * Factorial (n-1)
  2. 为什么在真正匹配的 -> 后面需要一个表达式?

最佳答案

处理评论:

真正匹配的更常见版本是

|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/

相关文章:

algorithm - 递归算法数组的时间复杂度

python - 递归硬币找零问题 - 计数排列

arrays - F#中的排名函数

wpf - F# WPF MVVM 我可以在不使 View 模型变量可变的情况下执行此操作吗?

f# - Deedle 数据框中的 pretty-print

使用 Visual Studio 代码格式化 F# 文件

Verilog 中 Always block 内的递归

c++ - 内存管理不好?大于 1 的类成员( bool )值,在递归函数中

recursion - 尾调用优化 Racket

函数式编程: Embedding functions in AST?