Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1584 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Puisssance d'un nombre(fonction récursive)

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Puisssance d'un nombre(fonction récursive)

n°2343632
Nat1329
Posté le 26-12-2019 à 14:56:54  profilanswer
 

Bonjour,
 
Je voudrais ecrire une fonction qui fait la puissance d'un nombre jusqu'à que ce nombre soit egale a une valeur a tester.
 
Par exemple,  
valeur a tester = 1455
Nombre = 3
 
Le programme doit faire 3×3×3...×3 jusqu'à que le result soit superieure ou egale a 1455.
 
Avez vous une idée ?  
 
Je sais faire pour la puissance d'un nombre avec l'exposant deja connu a l'avance ca donne ceci  mais pour mon exemple a faire je bloque.
 

Code :
  1. public int puiss(int n, int k)
  2. {
  3. int result;
  4. if (k == 0)
  5. return 1;
  6. else
  7. return  (n * puiss(n,k-1)) ;
  8. }


   

mood
Publicité
Posté le 26-12-2019 à 14:56:54  profilanswer
 

n°2343634
MaybeEijOr​Not
but someone at least
Posté le 26-12-2019 à 15:30:59  profilanswer
 

Bonjour,
 
Il te suffit de partir de l'exposant 0 et de l'augmenter à chaque nouvel appel de la fonction au lieu de le diminuer. Faut aussi changer la condition dans ta fonction pour qu'elle corresponde à supérieur ou égale à ton nombre limite.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2343705
rufo
Pas me confondre avec Lycos!
Posté le 29-12-2019 à 13:31:47  profilanswer
 

La récursivité, c'est une obligation ? Parce que c'est pas le plus optimisé. Même avec des petits nombres, tu arriveras vite à faire péter la pile d'appels et de sauvegarde du contexte. :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Cantine Calandreta : http://sourceforge.net/projects/canteen-calandreta
n°2343902
Lt Ripley
Mais ?!!
Posté le 03-01-2020 à 19:10:25  profilanswer
 

Salut
 
J'ai fait une méthode non récursive et une récursive.  Mais je ne sais pas pourquoi celle récursive donne le résultat plusieurs fois [:cerveau ddr555]  
 

Code :
  1. public static void moulinette(int base, double result) {
  2.  
  3.        double temp = 0;
  4.        int exposant = 1;
  5.  
  6.        while (temp<result) {
  7.  
  8.            temp = Math.pow(base, exposant);
  9.  
  10.            if (temp != result) {
  11.                exposant++;
  12.            }
  13.  
  14.        }
  15.  
  16.        if (temp == result) {
  17.            System.out.println("Succes : Base : " + base + "  Resultat : " + temp + "  Exposant : " + exposant);
  18.        }
  19.        else { System.out.println("Pas de correspondance" );}
  20.  
  21.    }


 
 

Code :
  1. public static void moulinetteRec(int base, double result, int exposant) {
  2.  
  3.        double temp = 0;
  4.  
  5.        while (temp<result) {
  6.  
  7.            temp = Math.pow(base, exposant);
  8.  
  9.            if (temp < result) {
  10.                exposant++;
  11.                moulinetteRec(base, result, exposant);
  12.            }
  13.  
  14.        }
  15.  
  16.        if (temp == result) {
  17.            System.out.println("Succes : Base : " + base + "  Resultat : " + temp + "  Exposant : " + exposant);
  18.        }
  19.        else { System.out.println("Pas de correspondance" );}
  20.  
  21.    }


---------------
Viens programmer | Mon topal de vente
n°2343906
MaybeEijOr​Not
but someone at least
Posté le 03-01-2020 à 20:53:52  profilanswer
 

Dans ta fonction récursive il faut virer le while (même s'il ne fait qu'un tour en fin de compte, il n'a pas de sens).
En fait tu as deux cas (à ce moment là tu sais que tu faire un IF ... ELSE ...), soit ton résultat de calcule est inférieur à celui demandé et donc tu rappelles ta fonction en incrémentant l'exposant, soit ton résultat est supérieur ou égale à celui demandé, auquel cas tu affiches la valeur atteinte de l'exposant.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2343931
Lt Ripley
Mais ?!!
Posté le 04-01-2020 à 18:04:56  profilanswer
 

Merci, j'ai viré le while, et j'ai le résultat une seule fois maintenant, niquel [:cerveau d]
 
Edit : c'est vrai aussi que dans l'énoncé du posteur il faut afficher le résultat dès qu'on atteint la valeur testée, qu'on soit égal ou supérieur
 
 

Code :
  1. private static void moulinette(int base, double resultat) {
  2.  
  3.        double temp = 0;
  4.        int exposant = 1;
  5.  
  6.        while (temp < resultat) {
  7.  
  8.            temp = Math.pow(base, exposant);
  9.  
  10.            if (temp < resultat) {
  11.                exposant++;
  12.            }
  13.        }
  14.        System.out.println("Base = " + base + "  Resultat (supp ou egal a " + resultat + " ) = " + temp + "  Exposant = " + exposant);
  15.    }
  16.  
  17.  
  18.  
  19.  
  20.    private static void moulinetteRec(int base, double resultat, int exposant) {
  21.  
  22.        double temp = 0;
  23.  
  24.        temp = Math.pow(base, exposant);
  25.  
  26.        if (temp < resultat) {
  27.            exposant++;
  28.            moulinetteRec(base, resultat, exposant);
  29.        }
  30.  
  31.  
  32.        else {
  33.            System.out.println("Base = " + base + "  Resultat (supp ou egal a " + resultat +" ) = " + temp + "  Exposant = " + exposant);
  34.        }
  35.    }


Message édité par Lt Ripley le 04-01-2020 à 19:30:51

---------------
Viens programmer | Mon topal de vente
n°2344272
mathieuu
Posté le 09-01-2020 à 15:48:28  profilanswer
 

Salut,
 
Niveau perf, cela ne me semble pas super judicieux de recalculer à chaque fois la nouvelle valeur avec avec pow :-/  
 
Je ne sais pas comment c'est codé pow, mais si c'est une fonction "con", chaque tour de récursion reviennent à faire en gros :  
3*3
3*3=9 puis 9*3=27
3*3=9 puis 9*3= 27 puis 27*3= 81
 
Si on cherche un grand nombre, je pense que c'est rapidement pas terrible comme solution :-/
 
alors qu'en gardant en mémoire le précédent résultat, on doit pouvoir se contenter de faire à chaque tour de récursion :  
3*3 =9
9*3 = 27
27*3 = 81
81*3 = 243
243*3=729
729*3=2187
 
 
 
Après si on cherche à faire encore des économies sur le nombre de calcul à faire, on doit pouvoir essayer de s'inspirer de la recherche dichotomique pour s'approcher plus vite de la valeur  mais ça va compliqué l'algo (et pas être super intéressant dans pour des valeurs assez basses)  
Exemple :  
3*3=9
9*9=81 (on économise le calcul de 3*9)
81*81= 6561 (on économise le calcul de 243, 729 , 2187 mais au final on est trop haut et on est obligé de vérifié l'intervalle (en recherche dichotomique on le coupe en 2 donc on calcul 729 qui est trop bas puis on calcul 2187 qui est la bonne solution, dans ce cas la on a juste économisé le calcul de 243 mais on y a perdu a faire le calcul de 6561 par rapport a l'algo précédent donc c'est kifkif, mais pour des plus grandes valeurs ça doit être rapidement rentable je pense :-)

n°2344385
Lt Ripley
Mais ?!!
Posté le 11-01-2020 à 15:29:01  profilanswer
 

J'ai fait une methode comme tu le dis (moulinetteMod).
 
Et j'ai implémenté un "contrôle" du temps, mais je ne sais pas si je l'ai fait correctement car j'ai eu ces valeurs hier :
 
moulinette : 2 998 300
 
moulinetteMod : 2 010 400
 
Puis aujourd'hui :
 
moulinette : 1 001 300
 
moulinetteMod : 1 000 500 et aussi un truc dans les 2 000 000
 
Et mon contrôle du temps ne fonctionne pas avec moulinetteRec la méthode récursive, je pense qu'il me faut des variables globales à ce niveau
 

Code :
  1. private static void moulinetteMod (int base, double resultat) {
  2.  
  3.        LocalDateTime first = LocalDateTime.now();
  4.        double temp = base;
  5.        int exposant = 1;
  6.  
  7.        while (temp < resultat) {
  8.  
  9.            temp = temp*base;
  10.  
  11.            exposant++;
  12.        }
  13.  
  14.        LocalDateTime second = LocalDateTime.now();
  15.        long diff = ChronoUnit.NANOS.between(first, second);
  16.  
  17.        System.out.println("Base = " + base + "  Resultat (supp ou egal a " + resultat + " ) = " + temp + "  Exposant = " + exposant + "  Temps execution programme = " + diff);
  18.    }


Message édité par Lt Ripley le 11-01-2020 à 15:29:37

---------------
Viens programmer | Mon topal de vente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Puisssance d'un nombre(fonction récursive)

 

Sujets relatifs
Fonction mail() de PHP avec plusieurs serveurs SMTPExcel VBA : fonction indiquant #value au démarrage
[MySQL] Ajouter un nombre à une colonne null[Python] Exercice nombre premiers et fonction seuil
Afficher / masquer div en fonction d'une liste déroulante (jQuery/JS)[RESOLU] petite aide appel fonction powershell
[MySQL] Nombre de cours et exercices avec une seules requête[résolu] Figer la valeur paramètre quand passé à une fonction
[AIDE] Highcharts - graphique en fonction d'une var ID et Time 
Plus de sujets relatifs à : Puisssance d'un nombre(fonction récursive)


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR