【发布时间】:2020-02-07 06:37:44
【问题描述】:
我一直在研究一个问题,该问题从捕获我的函数结果中受益匪浅,在我的研究中,我遇到了this 文章。我惊讶于“递归记忆”部分的核心是多么简单:
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
我觉得我了解如何它的工作原理,但如果我错了,请纠正我 - 这个函数保存了一个使用相同函数填充的列表。
困扰我的是我不明白为什么这行得通,最初我的印象是,一旦 haskell 评估一个函数,它就会释放用于在该函数内部存储变量的内存,但是在这里似乎如果列表的一部分是通过对该函数的一次调用进行评估的,那么这些值仍然可用于同一函数的另一次调用。
只是打字就让我头疼,因为我不明白为什么fib 2 的计算中使用的值应该在fib 3 或更好的是fib 100 的计算中可用?
我的直觉告诉我,这种行为有两个问题(我可能错了,但又不知道为什么):
- 此函数的纯度我们正在评估一个调用,该调用使用并非来自此函数参数的变量
- 内存泄漏不再确定 haskell 何时会从此列表中释放内存
【问题讨论】:
标签: haskell recursion lazy-evaluation fibonacci memoization