2017-12-05 2 views
0

Ich möchte eine Rekursion Funktion in R lösen, die alslapply Verwendung für eine Rekursion (also ohne foor loop)

p(t) = 0.5p(t-1) + 0.2p(t-2) 

für t definiert ist = 3, ..., 100, wobei die Anfangswerte p(1), p(2) sind angegeben.

Ich weiß, dass dies möglich wäre, mit einem for-Schleife wie diese einfach zu lösen hier: Using R to solve a recursion function

Ich frage mich, ob dies auch möglich ist, die lapply() Funktion in R mit? Ich denke, es sollte irgendwie möglich sein, aber ich weiß nicht, wo ich anfangen soll. Ich würde mich über jeden Hinweis freuen.

+0

'lapply' funktioniert ähnlich wie for-loop-Konstrukt. Es iteriert ein Listenobjekt, verarbeitet es und gibt es nur als Liste zurück. – TUSHAr

+1

Hilfe suchen ("Reduzieren"). – Roland

+1

Ich bin mir nicht sicher, ob ich es richtig verstanden habe, aber Sie können Reduce mit dem Argument accumulate = TRUE verwenden. Etwas in der Art von 'Reduce (Funktion (x, y) y = 0,5 * x + 0,2 * x, 3: 100, akkumulieren = TRUE)' – Sotos

Antwort

0

Sicher können Sie rekursive Funktion mit Lapply verwenden.

p <- function(t){ 
    if(t == 1){ return(1) } # arbitrary number 
    if(t == 2){ return(2) } # arbitrary number 

    return(0.5*p(t-1) + 0.2*p(t-2)) 
} 

lapply(3:100, p) 

Beachten Sie, dass es eine schlechte Idee ist es, eine rekursive Funktion für dieses Problem ohne irgendeine Art von memoization zu verwenden, da es von exponentieller Komplexität sein.

Der folgende Code funktioniert in linearer Zeit statt:

p_tab <- c(1, 2, rep(-1, 98)) # 1 and 2 arbitrary numbers 
p <- function(t){ 
    if(p_tab[t] != -1) return(p_tab[t]) 

    p_tab[t] <<- 0.5*p_tab[t-1] + 0.2*p_tab[t-2] 
} 

p_tab <- unlist(lapply(1:100, p)) 

p_tab wird mit den Zahlen gefüllt werden, die Sie benötigen. p_tab[100] wird zum Beispiel p(100) sein, wenn das die ist, die Sie brauchen.

+0

das ist genau das, was ich brauchte, vielen Dank !! –

+0

Froh, dass es geholfen hat! Überlegen Sie bitte, als Antwort zu akzeptieren. :) –