广义递归不适用于 Haskell 记忆

Generalized recursion doesn't work for Haskell memoization

阅读多个资料后,我想出了以下 memo 函数,用于在 Haskell 中使用“广义递归”进行记忆。但它不起作用。为什么?!

fib f 0 = 1
fib f 1 = 1
fib f n = fib f (n - 1) + fib f (n - 2)

memo f n = fList !! n
  where fList = map (f (fList !!)) [0..]

递归运行w/o记忆

λ> fix fib 30
1346269
(1.65 secs, 962,135,992 bytes)

它与“记忆”版本花费的时间相同:

λ> memo fib 30
1346269
(1.62 secs, 962,141,192 bytes)

但是,以下工作:

fibMemoDirect n = fibList !! n
  where fibList = map fib [0..]
        fib 0 = 1
        fib 1 = 1
        fib n = fibList !! (n - 1) + fibList !! (n - 2)
λ> fibMemoDirect 30
1346269
(0.01 secs, 93,728 bytes)

为什么上面 memo fib 的工作速度不如 fibMemoDirect ,因为两者都使用 CAF?

来源:

你快搞定了,但你的第三行需要

fib f n = f (n-1) + f (n-2)

...否则您甚至不会使用 f,而只是编写一个正常的递归指数斐波那契函数。