我看到如果我以两种不同的方式在函数上使用 memoise,我会得到两种不同的行为,我想了解原因。
# Non Memoised function
fib <- function(n) {
if (n < 2) return(1)
fib(n - 2) + fib(n - 1)
}
system.time(fib(23))
system.time(fib(24))
library(memoise)
# Memoisation stragagy 1
fib_fast <- memoise(function(n) {
if (n < 2) return(1)
fib_fast(n - 2) + fib_fast(n - 1)
})
system.time(fib_fast(23))
system.time(fib_fast(24))
# Memoisation strategy 2
fib_not_as_fast <- memoise(fib)
system.time(fib_not_as_fast(23))
system.time(fib_not_as_fast(24))
策略 1 非常快,因为它重用了递归结果,而策略 2 只有在之前已经看到确切输入的情况下才很快。
有人可以向我解释这是为什么吗?