我发现如果我以两种不同的方式在一个函数上使用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))
第一种策略非常快,因为它重用了递归结果,而第二种策略只有在先前看过完全相同的输入时才会很快。
能有人向我解释一下这是为什么吗?
fib
- 如何进行记忆化?在函数体中替换内容吗? - Frankfib <- function(n) {if (n < 2) return(1); Recall(n - 2) + Recall(n - 1)}
和ffib <- memoise(fib)
的时间相同。 - Frankfib
的记忆化版本存储在fib_not_so_fast
中。fib
本身不会作为一个记忆化函数被存储。 - Stibu