为什么我的递归函数在研发这么慢?递归、我的、函数

2023-09-11 01:49:08 作者:永逺有多逺

下面以30秒跑,而我希望它是几乎瞬间。是否有一个问题,我的code?

  X<  - 斐波纳契(35);

斐波纳契<  - 功能(SEQ){
    如果(SEQ == 1)返回(1);
    如果(SEQ == 2)返回(2);
    返回(斐波纳契(SEQ  -  1)+斐波纳契(SEQ  -  2));
}
 

解决方案

帕特里克·伯恩斯给出为r的例子地狱的一种方式做记忆化在研发与本地()<< - 。事实上,这是一个斐波纳契:

 &斐波纳契LT;  - 本地({
    备忘录<  -  C(1,1,代表(NA,100))
    F<  - 函数(X){
        如果(X == 0)返回(0)
        如果(X℃,)返回(NA)的
        如果(X>长度(备忘录))
        停止('X'太大实行)
        如果(!is.na(备忘录[X]))收益率(备忘录[X])
        答&所述;  -  F(X-2)+ F(X-1)的
        备忘录[X]<<  -  ANS
        答
    }
})
 

递归函数使用实例

The following takes about 30 seconds to run whereas I would expect it to be nearly instant. Is there a problem with my code?

x <- fibonacci(35);

fibonacci <- function(seq) {
    if (seq == 1) return(1);
    if (seq == 2) return(2);
    return (fibonacci(seq - 1) + fibonacci(seq - 2));
}

解决方案

Patrick Burns gives an example in R Inferno of one way to do memoization in R with local() and <<-. In fact, it's a fibonacci:

fibonacci <- local({
    memo <- c(1, 1, rep(NA, 100))
    f <- function(x) {
        if(x == 0) return(0)
        if(x < 0) return(NA)
        if(x > length(memo))
        stop("’x’ too big for implementation")
        if(!is.na(memo[x])) return(memo[x])
        ans <- f(x-2) + f(x-1)
        memo[x] <<- ans
        ans
    }
})