首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这些回忆录功能不同?

为什么这些回忆录功能不同?
EN

Stack Overflow用户
提问于 2015-09-10 17:43:04
回答 1查看 106关注 0票数 6

我看到,如果我用两种不同的方式在一个函数上使用回忆录,我会得到两种不同的行为,我想了解为什么。

代码语言:javascript
复制
# 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确实是快速的,因为它重用了递归结果,而stratagy 2只有在前面看到了准确的输入时才是快速的。

有人能给我解释一下为什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-10 18:04:45

我认为原因很简单。在缓慢的情况下,函数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)即可。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32508456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档