6

我看到如果我以两种不同的方式在函数上使用 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 只有在之前已经看到确切输入的情况下才很快。

有人可以向我解释这是为什么吗?

4

1 回答 1

6

我认为原因很简单。在缓慢的情况下,该功能fib_not_as_fast被记忆。在函数内部,fib被调用,它没有被记忆。更详细地说:当您计算 时fib_not_so_fast(24),在您拥有的函数内部fib(22) + fib(23)。这两个都没有被记住。

但是,在fib_fast中,您也在递归中使用记忆版本。因此,在这种情况下,fib_fast(24)需要评估fib_fast(22) + fib_fast(23). 这两个函数调用已经发生,当你计算fib_fast(23)并因此被记忆时。

起作用的是在定义函数之后再记忆一个函数。因此,只需重新定义该功能fib()即可 fib <- memoise(fib)

于 2015-09-10T18:04:45.150 回答