Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Algoritmo de Euclides Máximo Común Divisor

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Lun May 01, 2006 11:01 am
dacons
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Feb 2006
Mensajes: 48
Algoritmo de Euclides Máximo Común Divisor Responder citando

Hola a todos, estoy intentando hacer el susodicho algoritmo pero no hay forma,

Código:
sub mcd {
    $n=$_[0];
    $n1=$_[1];
    while (($_[0] % $_[1]) != 0) {
        $c=$_[1];
        $_[1] = $_[0] % $_[1];
        $_[0]=$c;
    }
    print "El mcd ($n , $n1) = $_[0] \n";
}
sub mcm {
    $n=$_[0];
    $n1=$_[1];
    $mcm= ($_[0] * $_[1]) / mcd($_[0],$_[1]);
    print "El mcm ($n , $n1) = $mcm ";
}

&mcd(945,651);
&mcm(945,651);


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

¿hay alguna otra forma de hacer este algoritmo?
Mensaje Lun May 01, 2006 11:14 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

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

Cambiales 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...
Código:
#!/usr/bin/perl
use warnings;
use strict;

sub mcd {
    my $a = $_[0];
    my $b = $_[1];
    my $c;

    # Nos aseguramos que $a siempre sea mayor que $b
    if ( $a < $b ) { ( $a, $b ) = ( $b, $a ) }

    # Bucle mientras no lleguemos a un resto de división igual a 0
    while ( ($b > 0) and (( $a % $b ) != 0) ) {
        #print "1: $a $b\n";
        $c = $b;
        $b = $a % $b;
        $a = $c;
        #print "2: $a $b\n";
    }

    # El resultado es el último divisor encontrado
    print "El mcd ($_[0] , $_[1]) = $b\n";
    return $b;
}

sub mcm {
    my $a = $_[0];
    my $b = $_[1];

    my $mcm = ($a * $b) / mcd( $a, $b );
    print "El mcm ($a , $b) = $mcm\n";

    return $mcm;
}

&mcd(945,651); # El mcd (945 , 651) = 21
&mcm(945,651); # El mcm (945 , 651) = 29295

Un cambio que se puede hacer en el bucle principal es agregar la última vuelta de procesado:
Código:
    while ( $b != 0 ) {
        # ... lo mismo que antes ...
    }

    # $a tiene el último divisor
    print "El mcd ($_[0] , $_[1]) = $a\n";
    return $a;

Más sobre el algoritmo de Euclides.
Mensaje Lun May 01, 2006 12:14 pm
dacons
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Feb 2006
Mensajes: 48
Responder citando

¿para que se utilizan las dos primeras líneas que empiezan por use?
Mensaje Lun May 01, 2006 12:27 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
Responder citando

use warnings; activa los avisos si Perl encuentra algo 'extraño' en tu código, que posiblemente provoque errores. También posibles errores de sintáxis.
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.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group