Voici un code calculant l'équivalent binaire d'un nombre.
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
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,
Partager