IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Exos de prog en récursivité (tangeante)


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Par défaut Exos de prog en récursivité (tangeante)
    Salut tout le monde je commence la programmation et il y a un exercice dont j'ai la solution mais je comprend toujours pas pourquoi la solution marche à moins qu'il y ai un erreur :

    Voici l'énoncé : Ecrire un programme récursif pour calculer la tengente de x en utilisant la formule :
    tan(x) = 2t / (1-t*t) dans laquelle t = tan (x/2) et le fait que si x est petit, par exemple inférieur à 10^-6 alors tan(x) est à peu près égale à x.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public class Main {
     
           public static double tan(double x){
            if(x<1e-8)
                return x;
            double t=tan(x/2);
            return 2*t/(1-t*t);
        }
     
        public static void main(String[] args) {
            ReadConsole c = new ReadConsole();
            System.out.println("Entrer le chiffre tangeante");
            double x = c.readInt();
            double res = tan(x);
            System.out.println(res);
        }
    }
    Moi dans cette solution je comprend que pour x on appelle la méthode tan. Dans ce cas si x est moins grand 0.0000000001 alors dans ce cas on retourne que tan est x. Par contre si x est plus grand alors dans ce cas on rappelle la fonction tan avec x divisé par deux pour encore recommencer encore et encore jusqu'à ce que x soit assez petit pour dire que on retourne x car il est infèrieur à 0.00000001 ce qui n'a aucun sens je l'admets.
    Pour résumé je ne comprend pas comment on arrive au deuxième return.

    Merci ça fait une heure que je suis dessus et j'y comprend que dalle ...

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Je pense que tu n'as pas compris le programme (ni la récursivité)

    Certes ton programme va appeler la méthoed "tangeante" en récursivement jusqu'à arriver à un x "assez petit". Mais ce qui est renvoyé par la méthode récursive, ce n'est pas tan(x/2), mais 2*t/(1-t*t) où t vaut tan(x/2)

    Et cette formule mathématique n'a rien d'absurde...

    Une fois que tu es arrivé à un x "assez petit" tu obtiens t=x. Tu remontes dans la méthode appelante qui renvoie 2*t/(1-t*t), soit 2*x/(1-x*x)

    Ce résultat est à son tour remonté dans la méthode "tangeante" qui l'avait appelé. On a donc à ce niveau t=2*x/(1-x*x). On passe alors à la ligne de retour de la méthode qui vaut 2*t/(1-t*t), soit 2*(2*x/(1-x*x))/(1-(2*x/(1-x*x)*2*x/(1-x*x)))

    On remonte encore d'un niveau... etc. etc. autant de fois qu'il y a eu d'appels récursifs à la méthode tangeante.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre émérite
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Par défaut
    De plus, sans avoir trop pu regarder ton code, je te conseille d'éviter de faire deux return dans une même méthode

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Par défaut
    Oui en effet je n'ai pas compris. J'ai du mal à comprendre ta réponse.

    Pour moi (je sais que c'est faux) le programme appelle la méthode et quand il arrive à t=tan (x/2); il rappelle forcément la méthode en en divisant x par deux. Je ne comprend pas comment cela peut-être autrement.

    Le deuxième return (pour moi toujours) ne peut jamais être atteints et si il l'est il renverrais ça au programme principal.

    Je ne comprend pas pourquoi le return se renverrait dans la même méthode, il devrait y avoir à la fin :

    return tan(2*t/(1-t*t))


    J'ai vraiment du mal avec cette récursivité ...

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 238
    Par défaut
    Salut,

    Le return d'une méthode ne retourne pas au 'programme principale' comme tu l'appel, mais à la méthode appellante.

    La méthode tan s'appelle elle meme avec à chaque fois X qui vaut la moitié.
    Lorsque X est inférieur à 1e-8, on renvoie la valeur à l'appel précédent, cet appel passe alors au calcul de la tangent : 2 * t / (1 - t * t). (Avet t qui a pour valeur le X précédent).
    Il renvoie alors le résultat de ce calcul à la méthode précédente qui n'est autre que tan.

    Et ainsi desuite les méthode se déempile en calculant à chaque fois la nouvelle valeur de t

    J'espère avoir été un peu plus clair.....

    a+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Par défaut
    Merci Khain, ta réponse m'a permis de mieux comprendre celle de CyberChouan et je pense avoir compris. +++

Discussions similaires

  1. [TP]Compiler un prog sans entrer dans TP7
    Par poppels dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 23/10/2002, 18h46
  2. Réponses: 8
    Dernier message: 17/10/2002, 12h52
  3. redémarrer un prog à partir d'un bouton
    Par yokito dans le forum Langage
    Réponses: 5
    Dernier message: 06/09/2002, 13h19
  4. Existe-t-il un langage de prog "virtuel" en Français
    Par HRS dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 10/06/2002, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo