广义递归不适用于 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?
来源:
- Haskell Wiki
- 爱德华·克梅特 Whosebug answer
你快搞定了,但你的第三行需要
fib f n = f (n-1) + f (n-2)
...否则您甚至不会使用 f
,而只是编写一个正常的递归指数斐波那契函数。
阅读多个资料后,我想出了以下 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?
来源:
- Haskell Wiki
- 爱德华·克梅特 Whosebug answer
你快搞定了,但你的第三行需要
fib f n = f (n-1) + f (n-2)
...否则您甚至不会使用 f
,而只是编写一个正常的递归指数斐波那契函数。