2013-03-26 3 views
0

Je souhaite programmer la fonction mathématique f(x)=sqrt(1^1+sqrt(2^2+sqrt(3^3)+...+sqrt(x^x))), où x doit être 1 <= x <= 10. J'ai essayé de programmer la fonction comme ceci:Programmer une fonction récursive mathématique

double f1Rek(int x) 
{ 
    if(x < 1) return sqrt(power(x,x)); 
    return sqrt(power(x,x) + f1Rek(x-1)); 
} 

La puissance de fonction est aussi une auto créée fonction récursive:

double power(int x, int n) 
{ 
    if(n == 0) return 1.0; 
    if(x == 0) return 0.0; 
    if(exp > 0) 
    { 
     return n * power(n, exp - 1); 
    } 
    if(exp < 0) 
    { 
     return 1/(n * power(n, -(exp-1)); 
    } 
} 

Le problème est la fonction f1Rek(int x), car il commence par la sqrt(x^x + sqrt(x-1^x-1.... Comment puis-je résoudre le problème d'une manière très élégante?

Mise à jour:

Avec la réponse de Jim Balter, j'ai créé une fonction avec 2 arguments:

double f2Rek(int i, int x) 
{ 
    if(i <= x) 
    { 
     return sqrt(power(i,i) + f2Rek(i+1, x)); 
    } 
    else return 0.0; 
} 

Est-il possible de définir une fonction récursive avec un seul argument.

+7

Êtes-vous excité à ce sujet dix ou est-ce un factoriel? – DiegoNolan

+0

Indice: 'double f1Rek (int k, int x)' – Beta

+0

Que voulez-vous dire par les dix? 1 <= x <= 10, voulez-vous dire les dix ici? – Oni1

Répondre

2

f (x) = sqrt (1^1 + sqrt (2^2 + ( sqrt (3^3) + ... + ( sqrt (x^x))) ) ...

(en supposant que ce qui est en gras)

équivalente,

f (x) = g (1, x)

g (i, n) = sqrt (i^i + g (i + 1, n)) si je < = n, sinon 0

Vous devriez être capable de coder élégamment votre fonction récursive à partir de cela.

En ce qui concerne une fonction avec un argument:

f est une fonction avec un seul argument. Il appelle une fonction d'aide récursive qui prend deux arguments. Il est clair que la fonction interne récursive a besoin de deux arguments, dont l'un est la valeur de terminaison, x. Dans une langue avec des fonctions locales cet argument peut être hissés hors de la fonction, par exemple,

double f(int x) 
{ 
    double g(int i) 
    { 
     return (i <= x)? sqrt(pow(i, i) + g(i+1)) : 0.0; 
    } 

    return g(1); 
} 

GCC prend en charge les fonctions locales, mais ils ne sont pas dans la norme C

+0

Le premier argument de g (1, x) devrait toujours être celui? – Oni1

+0

Regardez à nouveau ... 'g (i + 1, n)' ... ce n'est pas 1. Le premier argument * initial * est 1, car c'est ainsi que commence la série. Le second argument est toujours 'n' (l'argument x de f) car c'est la valeur de terminaison. –

+0

@ T.C. * "Le premier argument de' g (1, x) 'devrait toujours être celui" * Présenté comme ça, comment pourrait-il être autre chose? Je * pense * que vous vouliez dire «g (i, x)», et Jim a répondu à cela. – WhozCraig

1
double f1Rek(int x) 
{ 
    double res = 0.0; 
    for(int i=x; i > 0; i--) { 
    res = sqrt(power(i,i) + res)); 
    } 
    return res; 
} 
+1

Ce n'est pas récursif ... et pourtant l'OP l'a accepté. Soupir. –

+0

Oui, ce n'est pas récursif, mais j'obtiens de bons résultats. – Oni1

+1

Si tout ce dont vous avez besoin, ce sont les bons résultats, alors c'est utile ... et vous devriez changer votre question. Mais si vous faites des devoirs qui sont supposés vous aider à comprendre comment écrire des fonctions récursives, alors ce n'est pas utile. –

Questions connexes