P0 Ej6-c

P0 Ej6-c

de Martín Sader Somma -
Número de respuestas: 4

buenas!! mas o menos cuanto tiempo le deberia tomar a una compu calcular esta parte? no se si le err'e en el codigo o la pc esta cansada jajaj

se cicla haciendo el array de 671, no entiendo pq ese en especifico jajaj

En respuesta a Martín Sader Somma

Re: P0 Ej6-c

de Pedro Gonçalves Schwingel -
Holi, solo probé con numeros de hasta 4 cifras y no me llevaba nada de tiempo, probable que estés preso en un bucle o algo, si quieres escribime por eva y te paso el codigo que hice
En respuesta a Pedro Gonçalves Schwingel

Re: P0 Ej6-c

de Juan Pablo Borthagaray -
Hola Martín,

No debería llevar más que unos pocos segundos, pero obviamente puede depender de la máquina y de qué tan eficientemente hayas programado el código. Estoy de acuerdo con Pedro: tiene pinta de que queda iterando indefinidamente... si probás con menos de 1000, también se tara?

Si querés compartir lo que programaste, no hay ningún problema. (Sería diferente si fuera un ejercicio de entrega, pero justamente uno de los objetivos del práctico 0 es irle agarrando la mano a Octave.)
En respuesta a Juan Pablo Borthagaray

Re: P0 Ej6-c

de Martín Sader Somma -
uu impecable!! muchas gracias

lo dejé corriendo unos 10 minutos y me dio de semilla al 983, paso el codigo pq es preocupante esa diferencia jajaj



funcion collatz:

function res = collatz(m)

tope = 1
res = [m]
while tope < 201 && res(length(res))!=1
if mod(res(length(res)),2) == 0
res = [res res(length(res))/2]
else
res = [res 3*res(length(res))+1]
endif
tope=tope+1
endwhile

funcion para hallar el maximo:

function res = maxCollatz(m)

a=collatz(m)
b=a

res = length(a)

for i = [m-1:-1:1]
a=collatz(i)
if length(a)>res
res=i
b=a
endif
endfor

disp(b)

endfunction

(puse para q mostrara el array mas largo por curiosidad, pero entiendo que no deberia afectar pq está afuera del for)
En respuesta a Martín Sader Somma

Re: P0 Ej6-c

de Gonzalo Javier Diaz Ferreira -
Hola! ¿Cómo están?

Una consulta... ,cuando indica "mostrar" la idea es sólo probar el programa para un número menor a 1000?

Por ejemplo para collatz(999) obtengo 50 pasos y para collatz(1001) obtengo 101 pasos

Lo que no entiendo si el ejercicio pide algún tipo de deducción a partir de lo anterior...

por ejemplo: si aplicamos la función a una potencia de 2, nos devuelve el listado decreciente de todas las potencias...

collatz(1024) = [1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1]

Con respecto a la consulta de Martín, a mi me corre en menos de un segundo... intenté interpretar tu función pero no entiendo porqué usas el largo...
mi codigo (por si te sirve para comparar) es:

function collz = collatz(m) %comienzo funcion principal
             n = 100;
             a = []; % (vector dinámico)
             a(1) = m;

             % defino la funcion f dentro de mi funcion collatz
             function fcoll = f(m)
                       if (mod(m,2) == 0)
                             fcoll = m/2;
                       else
                             fcoll = 3*m + 1;
                       endif
              endfunction

       % luego hago un for hasta los 100 valores pero con un break por si llego antes al 1
            for i = 1:n
                 a(i+1) = f(a(i));

                 if (a(i+1) == 1);
                      break;
                 endif
            endfor

         % por ultimo devuelvo el vector "a"
          collz = a;

end % funcion principal

Gracias

Saludos