¿Por qué mi solución de fuerza bruta no produce una respuesta después de muchas horas?

Lo primero que debes decir es que tienes un gran error que es un gran ejemplo de por qué nos gusta usar muchas variables. Cada vez que aplicas una regla a i, la estás sobrescribiendo. Esto significa que cuando viene a incrementarlo para probar el siguiente número inicial, en realidad está incrementando el final de la última cadena, que es 1. ¡Por lo tanto, solo está calculando las cadenas para 1 y 2! Guarde el número de inicio en otra variable tan pronto como comience una nueva cadena, luego cárguelo de nuevo en I una vez que haya terminado la cadena. Esto en realidad resulta en un bucle infinito, porque ni 1 ni 2 son mayores que la condición de salida de 1,000,000.

Todavía no hay un delegado que este programa saldrá. El Proyecto Euler 14 dice que no se ha demostrado que todos los números iniciales lleguen a 1. Su programa podría haber encontrado uno que no lo hace y está atascado tratando de llegar a 1. Sugeriría agregar una condición de salida cuya longitud sea menor que , digamos, 10000. También debe almacenar y generar el número inicial que le proporcionó la cadena más larga. Cuando su programa salga (porque ahora sabemos que lo hará) verá si algún número alcanzó su límite y ejecuta solo los números que lo hicieron. Con un poco más de resultados para estos que muestran los pasos intermedios, podrá ver si está golpeando algún tipo de patrón que no se reduce a 1.

Además, una nota rápida sobre la eficiencia algorítmica: ha notado correctamente que este es un enfoque de fuerza bruta y altamente ineficiente. Un ejercicio útil para usted (una vez que tenga este trabajo) podría ser un enfoque de programación dinámica, donde almacena el número de pasos para que cada número llegue a 1, y luego lo usa para no tener que calcular la cadena para cada número que prueba. Por ejemplo, si ya sabe que 13 toma 10 pasos para llegar a 1, puede agregar 10 a la longitud de la cadena cada vez que un número se reduce a 13.

Entonces su código entrará en una iteración muerta. Revisalo.

i = 1, en la primera iteración externa, el ciclo while no se calculará.

i = 2, en la segunda iteración externa, el bucle while se calculará, de acuerdo con su código, se establecerá nuevamente en 1, lo que significa que la próxima iteración externa seguiré siendo 2, y agian y nuevamente siempre 2, la externa El bucle nunca se terminará.

Lo que tiene que modificar es simplemente definir una variable local dentro de la iteración externa:

para (i; i <100000; i ++) {

int tmp = i;

while (tmp! = 1) {

}

}

Pruebe esto y encuentre la respuesta usted mismo:

Solución de clase pública {
public static void main (String [] args) {
int num = 1000000;
int cuenta = 0;
para (largo i = 1000000; i> 1; i -) {
System.out.println (i);
int temp = 0;
while (num! = 1) {
if (num% 2 == 0) {
num = num / 2;
temp ++;
}
más{
num = 3 * num + 1;
temp ++;
}
if (temp> count) {
cuenta = temp;
}
}
}
System.out.println (cuenta);
}
}

Creo que encontré tu problema:

Para i = 1 va y no entra en el bucle.

i = 2, ingresa el while, y cuando adentro va al primero si le da a i el valor 1. Luego, cuando el for continúa ejecutándose, el valor de i es 1, y el ciclo anterior se repetirá.

está cambiando la variable del bucle, y por eso el bucle no va “hacia adelante”.

Cree una variable temporal y úsela mientras tanto, en lugar de i.

Otros han señalado su bucle infinito, pero quería mencionar que incluso si arregla eso, está imprimiendo la longitud de la cadena, no el número que lo produce.

Al almacenar el máximo, también debe almacenar el número que produjo esa cadena.

  1. En el ciclo while dentro del ciclo for, solo está comprobando la condición de i! = 1. cuando i = 1 el programa no entra en el ciclo while y para los incrementos de ciclo i.
  2. Ahora i = 2 y entras en el ciclo while. i = 2 es divisible por 2, entonces si la afirmación es verdadera. Entras en la declaración if. i / = 2 te da 1. i = 1. Comprueba la condición del bucle while que resulta ser falsa (i! = 1). Te sales del ciclo while.
  3. Ahora estamos en el ciclo for nuevamente. Incremente la i en 1. i = 2.
  4. vaya al paso 2.

Como puede ver, tiene un bucle infinito.

No produce una respuesta porque se atasca en un bucle sin fin donde volteo entre 1 y 2.

Pasemos juntos por este programa, ¿de acuerdo?

Paso 1) Cuando entramos por primera vez en el bucle for i = 1, omitimos la instrucción while.

Paso 2) La siguiente iteración i = 2, así que entramos en la instrucción while y debido a que 2 es divisible por 2, entramos en la primera instrucción if donde dividimos i por dos: i = 2/2 = 1.

Paso 3) Ahora que i = 1 salimos del ciclo while para continuar con el ciclo for. ¿Notaste algo aquí? ¡Esto es lo mismo que pasar del paso 1 al paso 2! Así que ahora estamos atrapados en un bucle sin fin entre los pasos 2 y 3.

Una verdadera solución de fuerza bruta implicaría ver qué cadena resulta de cada número de 1 a 999,999. Tienes parte de esa lógica correcta. Para su variable de contador, está utilizando i. Probablemente quiera usar otra variable dentro del bucle como la variable para manipular para cada iteración, digamos j. Establecería j igual a i como la primera declaración dentro del cuerpo de su bucle for . Luego, verás que aquellos que estoy dentro del cuerpo del for- loop deberían ser j .

Su programa está en un bucle eterno. El valor de i oscilará para siempre entre 1 y 2. Simplemente ejecútelo en el depurador y compruébelo usted mismo.