gpt4 book ai didi

r - 为什么这些内存功能不同?

转载 作者:行者123 更新时间:2023-12-03 14:19:20 25 4
gpt4 key购买 nike

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

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

最佳答案

我认为原因很简单。在慢速情况下,函数 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)将工作。

关于r - 为什么这些内存功能不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32508456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com