• Publicidad

Algoritmo de Euclides Máximo Común Divisor

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Algoritmo de Euclides Máximo Común Divisor

Notapor dacons » 2006-05-01 12:01 @542

Hola a todos, estoy intentando hacer el susodicho algoritmo pero no hay forma,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub mcd {
  2.     $n=$_[0];
  3.     $n1=$_[1];
  4.     while (($_[0] % $_[1]) != 0) {
  5.         $c=$_[1];
  6.         $_[1] = $_[0] % $_[1];
  7.         $_[0]=$c;
  8.     }
  9.     print "El mcd ($n , $n1) = $_[0] \n";
  10. }
  11. sub mcm {
  12.     $n=$_[0];
  13.     $n1=$_[1];
  14.     $mcm= ($_[0] * $_[1]) / mcd($_[0],$_[1]);
  15.     print "El mcm ($n , $n1) = $mcm ";
  16. }
  17.  
  18. &mcd(945,651);
  19. &mcm(945,651);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

¿Dónde está el fallo? Según mi editor de Perl está en $_[1] = $_[0] % $_[1];

¿Hay alguna otra forma de hacer este algoritmo?
dacons
Perlero nuevo
Perlero nuevo
 
Mensajes: 48
Registrado: 2006-02-27 04:15 @219

Publicidad

Notapor explorer » 2006-05-01 12:14 @551

Estas usando variables globales. Eso quiere decir que las variables de una función interfieren en la otra.

Cámbiales de nombre, o mejor, usa my.

Otro fallo es jugar con los valores $_[0] para devolver valores. Es mejor usar el return siempre que sea posible...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. sub mcd {
  6.     my $a = $_[0];
  7.     my $b = $_[1];
  8.     my $c;
  9.  
  10.     # Nos aseguramos que $a siempre sea mayor que $b
  11.     if ( $a < $b ) { ( $a, $b ) = ( $b, $a ) }
  12.  
  13.     # Bucle mientras no lleguemos a un resto de división igual a 0
  14.     while ( ($b > 0) and (( $a % $b ) != 0) ) {
  15.         #print "1: $a $b\n";
  16.         $c = $b;
  17.         $b = $a % $b;
  18.         $a = $c;
  19.         #print "2: $a $b\n";
  20.     }
  21.  
  22.     # El resultado es el último divisor encontrado
  23.     print "El mcd ($_[0] , $_[1]) = $b\n";
  24.     return $b;
  25. }
  26.  
  27. sub mcm {
  28.     my $a = $_[0];
  29.     my $b = $_[1];
  30.  
  31.     my $mcm = ($a * $b) / mcd( $a, $b );
  32.     print "El mcm ($a , $b) = $mcm\n";
  33.  
  34.     return $mcm;
  35. }
  36.  
  37. &mcd(945,651); # El mcd (945 , 651) = 21
  38. &mcm(945,651); # El mcm (945 , 651) = 29295
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Un cambio que se puede hacer en el bucle principal es agregar la última vuelta de procesado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     while ( $b != 0 ) {
  2.         # ... lo mismo que antes ...
  3.     }
  4.  
  5.     # $a tiene el último divisor
  6.     print "El mcd ($_[0] , $_[1]) = $a\n";
  7.     return $a;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Más sobre el algoritmo de Euclides.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor dacons » 2006-05-01 13:14 @593

¿Para que se utilizan las dos primeras líneas que empiezan por use?
dacons
Perlero nuevo
Perlero nuevo
 
Mensajes: 48
Registrado: 2006-02-27 04:15 @219

Notapor explorer » 2006-05-01 13:27 @602

use warnings; activa los avisos si Perl encuentra algo 'extraño' en tu código, que posiblemente provoque errores. También posibles errores de sintaxis.

use strict; nos 'obliga' a programar de una forma estricta: todas las variables han de ser definidas antes de ser usadas, para indicar si son locales o globales.

Yo a veces uso use diagnostics; para producir una salida mucho más extensa con la explicación del error o aviso.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados