Ver Mensaje Individual
  #2 (permalink)  
Antiguo 01/06/2012, 11:43
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Explicación script números primos, quien se atreve?

Es un script recursivo que va calculando los números primos y los agrega a la línea de comandos.

Podés hacer sh -x script para ver cómo se van dando los cálculos.

Cuando pasé el código a un archivo, lo que vi fue un bucle infinito, ese código no es correcto.

Además de los comentarios que ya tiene, agregaría:

* Se guarda en LIMITE el parámetro de la línea de comandos, supongamos 4
* Se llama a la función Primos con el parámetro 1
* Se calcula n como $1 + 1 (en el primer caso, n=2 porque se llamó a Primos con 1)
* shift elimina uno de los argumentos de la línea de comandos, en este caso como solamente hay 1, queda vacía.
* n = 2, LIMITE=4, por lo que no se sale en el IF
* el FOR itera, si está escrito en esta forma abreviada, sobre los argumentos de línea de comandos ($@). En este caso, como el shift eliminó el único que había, no se hace nada.
* Se llama a Primos con $n $@ $n, es decir "Primos 2 2"
* Se vuelve a calcular n, esta vez quedando con el valor 3 (primer argumento + 1).
* shift deja a $@ como "2" en vez de "2 2"
* n=3, LIMITE=4 => no se sale en el IF
* se entra en el FOR con i=2.
* 2*2 = 4 > 3, por lo que se sale del for vía break.
* Se lama a Primos con $n $@ $n, es decir 3 2 3
* Se vuelve a calcular $n, resultando n = 4
* shift elimina el primer 3 de $@, resultando "2 3"
* n=4=LIMITE, se sale por el IF, imprimiendo el resultado "2 3"

Me parece muy rebuscado, a menos que se quiera explicar un concepto puntual yo lo haría así:

Código BASH:
Ver original
  1. X=2
  2. N=10 # o $1 si se quiere utilizar en un script y que tome el primer argumento
  3. RESULTADO=""
  4.  
  5. while (( $X * $X < $N ))
  6. do
  7.     if (( $N % $X ))
  8.     then
  9.         echo -n $X # o imprimimos el número, o lo vamos guardando en una variable
  10.         RESULTADO="$RESULTADO $X"
  11.     fi
  12. done
  13.  
  14. echo $RESULTADO
Puede tener algún error, lo escribí de memoria. Pero se ve claramente que es mucho más simple :)

Saludos.

Última edición por AlvaroG; 03/06/2012 a las 09:07 Razón: borrado comentario que no aplica