5
2つの異なる方法でmemoiseを関数に使用すると、2つの異なる動作が得られ、その理由を理解したいと思います。正確な入力が前に見てきた場合stratagy 2が速いだけであるのに対し、それは、再帰的な結果を再利用するようこれらのメモ機能はなぜ異なっていますか?
# 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は、本当に速いです。
これがなぜ私に説明できますか?
フォローアップ: 'fib'が既に定義されているとします。あなたはどのようにそれをメモしますか?関数の本体のものを代用するか? – Frank
@Frank - 'Recall'は、これらの状況を回避するのに便利です。あなたがRで再帰関数を書くなら、 'Recall'を使うべきです。 – Dason
@Dasonああ、このような関数があったのか分かりませんでした。私が正しく理解していれば、memoiseパッケージがそのケースに対処するように設定されていないように見えます。私は 'fib < - function(n){if(n <2)return(1);}の同じタイミングを見ています。 'ffib < - memoise(fib) 'の場合には、recall(n-2)+ Recall(n-1)}'となります。 – Frank