2017-09-27 1 views
0

Je cherche un moyen efficace d'imbriquer la même fonction dans R jusqu'à ce qu'une condition soit remplie. J'espère que l'exemple suivant illustre clairement mon problème.
Considérons la fonctionImbrication d'une fonction dans R jusqu'à ce qu'une condition soit remplie

f (x) = x^2 + 1, avec x> 1.

Désignons

f^{(k)} (x) = f (f (f (... f (x)))),

où la fonction f est évaluée k fois à l'intérieur de lui-même. Soit M> 0, avec M donné.
Existe-t-il une routine efficace dans R pour déterminer la valeur minimale de k telle que f^{(k)} (2)> M?
Merci.

+0

Je pense qu'il serait plus naturel d'écrire une fonction récursive –

+0

Salut @Moody_Mudskipper. Dans mon problème d'origine, j'ai essayé d'écrire une fonction récursive. Cependant, cette récursion n'est pas possible. Pour cette raison, j'examine des approches alternatives. Merci pour votre suggestion. – Rodrigo

+0

mmm ... vous devriez montrer un exemple montrant pourquoi la récursivité ne fonctionnerait pas –

Répondre

0

Rien de spécial pour cela. Il suffit d'utiliser une boucle:

function(x, M) { 
    k <- 0 
    repeat { 
    x <- x^2 + 1 
    k <- k + 1 
    if (x > M) 
     break 
    } 
    k 
} 

pas particulièrement efficace, mais souvent les frais généraux d'évaluation f sera supérieure à la tête de la boucle. Si ce n'est pas le cas (et ce n'est peut-être pas pour ce f particulier), je suggérerais de faire l'équivalent en C ou C++ (peut-être en utilisant Rcpp).

0

Ce serait l'approche récursive:

# 2^2 + 1 == 5 
# 5^2 + 1 == 26 
# 26^2 + 1 == 677 

f <- function(x,M,k=0){ 
    if(x <= M) k <- f(x^2 + 1,M=M,k+1) 
    return(k) 
} 
f(2,3) # 1 
f(2,10) # 2 
f(2,50) # 3 
f(2,700) # 4 
+0

Compte tenu de vos approches, Moody_Mudskipper et user2554330, je vois que le problème était plus simple que je ne le pensais. Merci à vous deux. – Rodrigo