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

C Discussion :

Algorithme de Lucas


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 53
    Par défaut Algorithme de Lucas
    Bonjour,
    J'aimerai écrire une fonction récursive me permettant de calculer xn pour x réel et n entier naturel en utilisant la définition récursive suivante :
    xn = 1 pour n = 0,
    xn = (x(n/2))2 pour n pair,
    xn = xn−1.x pour n impair.

    Merci de m'apporter votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Peut-être que je n'ai pas compris, mais je ne vois rien de récursif dans ce que tu demandes.
    D’après ce que j'ai compris c'est un code qui ressemble à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    float lucas(float x, unsigned n)
    {
      if (n == 0) return (1);
      if (n & 1) return (x * pow(x, n - 1));
      return (2 * pow(x, n / 2));
    }
    Bref la fonction ne s'appelle pas elle même.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 53
    Par défaut
    Merci Baragouine pour ta réponse, je viens de porter une modification au sujet.
    J'ai effectivement écrire la fonction de façon normal mais j'aimerai l'écrire d'une autre façon(récursive)

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Je comprends mieux, d'ailleurs je dois admettre que c'est un bon petit exo à faire.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 53
    Par défaut
    Oui bien intéressant j'avoue

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Finalement cette exo est tellement simple que le seul moyen de t'aider (que j'ai trouver) c'est de te donner le code.
    Il suffit simplement de traduire ton énoncer en code:

    lucas: (x : réel, n : entier naturel) -> réel
    si n = 0 renvoie 1
    si n est impaire renvoie lucas(x, n - 1);
    renvoie lucas(x, n / 2) * lucas(x, n / 2);

    Je ne vois rien de compliquer.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 53
    Par défaut
    renvoie lucas(x, n / 2) * lucas(x, n / 2);

    n paire dans ce cas? ouais plutôt simple j'ai pas eu le flair

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Oui n paire dans ce cas. En tout cas bonne chance pour la suite (si il y en a une).
    Et tu peux optimiser soit en stockant la valeur, soit en utilisant pow (pour élever au carré) histoire de ne pas faire deux fois la même chose.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 53
    Par défaut
    Merci beaucoup pour ton aide

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par baragouine Voir le message
    Je comprends mieux, d'ailleurs je dois admettre que c'est un bon petit exo à faire.
    En C probablement. Parce qu'en Python ça va pas super loin...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def lucas(n, p):
    	if p == 0: return 1
    	return n * lucas(n, p-1) if p & 1 else lucas(n, p//2) ** 2
    # lucas()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par steph_ntic Voir le message
    renvoie lucas(x, n / 2) * lucas(x, n / 2);
    Ceci fera 2 fois l'opération. Si n est petit ce n,est pas très grave, sinon tu vas effectuer beaucoup plus/trop d'opérations.
    Perso je ferais ça plus ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    float power(float value, unsigned int p)
    {
      if (p == 0) return 1;
      if (p == 2) return value * value;
      if (p % 2 == 1) return value * power(value, p-1);
      return power(power(value, p/2), 2);
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Ceci fera 2 fois l'opération....Perso je ferais ça plus ça
    Mmmmoui...Toutefois tu invoques quand-même un appel de fonction et un test supplémentaire juste pour éviter de multiplier un résultat par lui-même. Est-ce vraiment optimum comme rendement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    float power(float value, unsigned int p) {
      if (p == 0) return 1;
      if (p % 2) return value * power(value, p-1);
      float f=power(value, p/2);
      return f*f;
    }
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Mmmmoui...Toutefois tu invoques quand-même un appel de fonction et un test supplémentaire juste pour éviter de multiplier un résultat par lui-même. Est-ce vraiment optimum comme rendement ?
    Aucune idée, en pratique j'aurais fait comme ta dernière réponse.
    Mais dans le cadre d'un exercice, je préfère faire apparaître la puissance de 2.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Est-ce vraiment optimum comme rendement ?
    Juste pour t'embêter , avec des fonctions avec un return final, mais elle n'est pas réentrante
    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
    19
    20
    21
    22
    23
    float lucas(float value, unsigned int p) {
        float tmp;
     
        if (p == 0) {
            tmp = 1;
        } else
            tmp = lucas_1(value, p, &tmp);
        }
     
        return tmp;
    }
     
    // XXX : tmp never NULL
    float lucas_1(float value, unsigned int p, float* tmp) {
        if (p % 2) {
            (*tmp) = (value * lucas_1(value, (p - 1), tmp);
        } else {
            (*tmp) = lucas_1(value, (p / 2), tmp);
            (*tmp) = (*tmp) * (*tmp);
        }
     
        return (*tmp);
    }

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Juste pour t'embêter
    Oui, c'est d'ailleurs à ça qu'on te reconnait

    Citation Envoyé par foetus Voir le message
    avec des fonctions avec un return final, mais elle n'est pas réentrante
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    float lucas(float value, unsigned int p) {
        float tmp;
     
        if (p == 0) {
            tmp = 1;
        } else
            tmp = lucas_1(value, p, &tmp);
        }
     
        return tmp;
    }
    Euh ouais... La fonction reçoit l'adresse d'une variable (donc à priori elle va la modifier durant son exécution) mais cette variable est ensuite écrasée par le retour de la fonction !!!
    Là j'ai... peur

    @steph_ntic
    fais pas attention, on déconne, on s'amuse, mais surtout ne prends pas exemple sur nos codes. Enfin si, tu peux prendre exemple sur les miens car ils sont une référence mais n'utilise surtout pas ceux de foetus
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 53
    Par défaut
    J'apprend vraiment de tout ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul de flux optique par l'algorithme de Lucas et Kanade
    Par black_hole dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 20/12/2015, 22h56
  2. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

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