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 Perl Discussion :

programme récursif, calcul de nombres binaires


Sujet :

Langage Perl

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut programme récursif, calcul de nombres binaires
    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
    24
    25
    26
    27
    28
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
     
    sub binary {
    	my ($n) = @_;				# $n = 37	18	9	4	2	1
    	return $n if $n == 0 or $n == 1;
     
    	# quotient
    	my $k = int($n/2);			# $k = 18	9	4	2	1
    	# reste
    	my $b = $n % 2;				# $b = 1	0	1	0	0	1
     
    	# extension binaire de k
    	my $E = binary($k);			
     
    	return $E.$b;							
    }
     
    # création d'une pile : LIFO (Last In, First Out)
    # ordre d'entrée 101001
    # ordre de sortie inversé : 100101  (2^5 + 2^2 + 2^0 = 32 + 4 + 1 = 37)
     
     
     
    my $bin = binary(37);				# 100101
    Voici un code calculant l'équivalent binaire d'un nombre.
    Prenons 37 par exemple. Au premier passage, $b = 1 et $k = 18. Le sous-programme est donc rappelé avec la valeur 18 en argument. On ne sort du sous-programme que quand l'argument passé est 1 ou 0 et c'est ce premier return qui permet la terminaison car dans ce dernier passage, le sous-programme n'est plus rappelé.

    Y a-t'il bien la création d'une pile? Etant donné que l'on commence par calculer le dernier chiffre, puis l'avant-dernier ... jusqu'au premier.
    Je ne comprends pas le second return $E.$b. Quand on tombe sur un return, normalement la valeur est renvoyée au script principal dans $bin de my $bin = binary(). On passe parmi les 2 returns au cours de l'exécution du programme et donc pourquoi n'y a-t'il qu'un seul retour dans $bin? Pourquoi alors que c'est le return 1 ou return 0 qui termine la boucle est la réponse complète qui est renvoyée?

    Je pense que tant qu'il y a un passage dans ce sous-programme, les valeurs renvoyées s'accumulent en mémoire et c'est seulement quand plus aucune valeur ne s'ajoute que Perl sait qu'il doit renvoyer le tout.




    Merci pour votre aide,

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Le return ne revient pas à l'appel dans le programme principal, il revient au dernier appel de la fonction, le dernier appel de la pile donc.
    Le return 0 ou 1 n'est pas le dernier return, c'est le premier, tous les autres appels de la pile attendent que leur propre appel à binary() retourne avant de retourner eux-même.

    Essaye d'appeler cette fonction pour mieux comprendre :
    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
    sub binary {
      my ($n, $h) = @_;
      print "Entrée dans binary(), n = $n, hauteur de la pile = $h.\n";
     
      if($n == 0 or $n == 1) {
        print "Retour $n de binary(), hauteur de la pile = " . ($h - 1) . ".\n";
        return $n;
      }
     
      # quotient
      my $k = int($n/2);
      # reste
      my $b = $n % 2;
     
      print "Appel récursif de binary($k), hauteur de la pile = " . ($h+1) . ".\n";
      # extension binaire de k
      my $E = binary($k, $h + 1);			
     
      print "Retour $E$b de binary(), hauteur de la pile = " . ($h - 1) . ".\n";
      return $E.$b;		
    }
     
    binary( 37, 1);
    --
    Jedaï

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Merci beaucoup pour ce script explicatif, j'ai bien compris le fonctionnement maintenant.

  4. #4
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Est-ce un des exemples du 1er chapitre de High Order Perl ?

    Je trouve le bouquin extrêmement bien fait. C'est un plaisir. Je commence tout juste le chapitre 3 mais en recommande déjà chaudement la lecture: la perspective fonctionnelle est passionnante.

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par iblis
    Est-ce un des exemples du 1er chapitre de High Order Perl ?
    Oui, bien vu. Au début, j'ai trouvé cela un peu déprimant de buter dès le premier exemple mais vu sous un autre angle : 'Au moins je connais, au plus j'apprendrai'

    Les livres sont vraiment une très bonne façon de progresser, j'ai commencé avec 'Perl best practices' et j'enchaîne maintenant avec 'High Order Perl'.

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

Discussions similaires

  1. programme qui calcule le nombre de caractères d'une chaîne
    Par sk8trasher dans le forum Débuter
    Réponses: 15
    Dernier message: 21/06/2012, 10h12
  2. Réponses: 6
    Dernier message: 13/12/2010, 00h09
  3. un programme qui calcule le nombre des mots
    Par komat dans le forum Débuter
    Réponses: 3
    Dernier message: 06/12/2010, 23h46

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