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
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
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.)
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.)
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)
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)
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
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