¿Cómo se mejora la capacidad de tomar tareas escritas y traducirlas a código?

Esto va a ser largo ya que estoy describiendo mi proceso de pensamiento.

Creo que es un problema común que todos enfrentan cuando comienzan a codificar. La codificación es como cualquier otro pasatiempo donde necesitas practicar para dominarlo.

Mi sugerencia es pensar en lo básico, dar pequeños pasos, desarrollar un algoritmo, buscar la sintaxis en Google y conquistarla. Cuando comience a resolver un problema, recogeré un lápiz y un papel; Ni siquiera pensaré en java / python / c. Intentaré resolver las cosas en lugar de pensar en el código.

Revisemos su problema de encontrar un número primo hasta el 1000. A continuación se detalla mi proceso de pensamiento.

  • ¿Qué es un número primo? He leído que si algo es solo divisible 1 y eso significa que es un número primo.
  • Luego trataré de recoger un pequeño conjunto de datos, por ejemplo, solo consideraré el recuento hasta 7.
  • Analicemos:
    • 1 no se considera en absoluto.
    • 2 es primo porque lo sé.
    • ¿Es 3 prime? – Apliquemos nuestra definición de cebador – 3 no es divisible por 2 por lo tanto cebador.
    • ¿Es 4 prime? – No es divisible por 2.
    • Similarmente 5,6 y 7.
  • Vamos a codificarlo ahora hasta el 7.
    • si (número == 2) devuelve verdadero;
    • si (número == 3) verifique si es divisible por 2 o no;
    • si (número == 4) verifique si es divisible por 2/3 o no;
    • De manera similar, verifique si 5/6/7 son divisibles por números que aparecieron antes de ellos.
  • ¿Puedo ver un patrón aquí? Sí, creo que parece un bucle aquí.
    • Déjame tomar el mayor aporte, que es 7 ahora.
    • Repetiré hasta 7 y no tengo que considerar 1, por lo tanto, mi bucle es como for(i = 2; i < 7; i++)
    • En este bucle tengo que dividir 7 con todo y si el resto es 0, significa que no es primo, es decir
      • for(i = 2; i < 7; i++) { if(7%i == 0) return false}
    • Tengo que hacer este tipo de bucle para todo. Así que puedo reemplazar 7 por n. Oh sí. Así que mi código es for(i = 2; i < n; i++) { if(n%i == 0) return false}
    • Y si para fines de bucle y todavía no he devuelto, eso significa que es un número de cebador.
  • Genial, ahora puedo escribir un método que me devolverá si un número dado es un número de cebador o no.
  • Dios mío, acabo de resolver mi problema. Tengo un método que me devolverá si un número dado es primo o no. Solo tengo que escribir un bucle que seguirá dando entradas a mis métodos hasta 1000.
  • Vamos a escribirlo:

público booleano estático isPrime (int n) {para (int i = 2; i <n; i ++) {si (n% i == 0) devuelve false; } devuelve true; }

vacío estático público principal (Cadena … args) {
para (cuenta int = 2; cuenta <= 1000; cuenta ++) {
if (isPrime (count)) System.out.println (count);}}

  • Ahora tengo algo funcionando. ¿Puedo optimizarlo? Sí, eso creo. Vamos a empezar entonces y el proceso continúa.

En resumen lo que hicimos:

  • Entendimos el problema.
  • Tomamos un pequeño subconjunto del problema.
  • Piense a través de una solución.
  • Pseudo codifíquelo y comprobé que funciona.
  • Manchado un patrón, en su caso.
  • Probamos nuestra solución con una sola entrada.
  • Probamos nuestra solución con múltiples entradas.
  • Y luego generalizamos la solución para resolver nuestro problema.
  • Ahora podemos enviar nuestra tarea o aún podemos pensar en ella para una mejor solución.

Por encima del proceso de pensamiento parece lento y tedioso. Pero créame cuando esté en la práctica, realizará todos esos pasos en su cabeza en un minuto.

Espero que ayude.

Feliz codificacion

Se necesita práctica. No hay alternativa a la práctica.

Una cosa que puede hacer es dividir la tarea escrita en pasos y luego codificar paso a paso. Mientras lo hace, puede ver, para cada paso, cuál es la mejor construcción de programación que podría usar como si en el caso de la declaración, la instrucción de cambio , los bucles, etc.

Por ejemplo, como mencionó en la descripción sobre la impresión de números primos hasta 1000. Puede dividir las tareas de la siguiente manera:

  1. Genera números hasta 1000. (¿Cuál sería la mejor manera de hacerlo? ¿Los bucles pueden ser?)
  2. A continuación, compruebe si cada número es número primo o no. (Esta es la tarea que puede desglosar más).
  1. Cada número par no es primo excepto un número .
  2. Ahora piensa en cómo codificarás la lógica para los números impares.
  • Imprima el número si es primo.
  • Más practicas, vas a mejorar y más rápido en eso. Sigue practicando y resolviendo problemas consistentemente . Siempre revisa el código que escribes e intenta mejorarlo. Mira las implementaciones de ejemplo que están escritas por programadores experimentados.

    Realmente no hay manera de mejorar en esta área aparte de hacerlo, una y otra y otra y otra vez.

    Siempre que escuche las palabras “[hacer algo] con todos los [algo] hasta [algún número], o [hacer algo] con el primer [número] [algo], lo primero que debería aparecer en su cabeza es algo así como esta:

    para (int i = 0; i <[número]; ++ i) {
    [hacer algo]
    }

    Eso no es todo lo que hay, por supuesto, ni mucho menos. Lo que estoy diciendo es que ciertas frases, que implican repetir algún procedimiento (es decir, “imprimir”) para un número finito de algo (“todos los números primos hasta 1000”) deberían hacerte pensar en términos de una estructura de bucle como lo anterior.

    Si tiene tiempo y está decidido a tener éxito, le recomendaría que haga más codificación. Comience con “imprimir los primeros 1000 enteros”. Seguramente puedes ver cómo eso implica un bucle como este:

    para (int i = 0; i <1000; ++ i) {
    System.out.println (i);
    }

    Lo siento si mi Java no es perfecta, pero entiendes la idea.

    Sigue avanzando desde allí.

    “imprima todos los números pares hasta 1000.”, por ejemplo. Hay dos formas de hacer esto:

    para (int i = 0; i <1000; ++ i) {
    if (i / 2 * 2 == i) System.out.println (i);
    }

    o…

    para (int i = 0; i <1000; i = i + 2) {
    System.out.println (i);
    }

    Ambos producen el mismo resultado. ¿Es uno mejor que el otro? ¿Por qué?

    Y sigue y sigue y sigue. Piensa en otras cosas y en cómo las harías. Así es como te pones mejor.

    Programación competitiva.

    Hay una respuesta que leí aquí en algún lugar que explica esto mucho mejor de lo que estoy a punto de hacer, pero aquí va de todos modos.

    Escribiría paso a paso cómo resolvería el problema, como si estuviera a mano en un papel. Para cada paso, tus sustantivos (las cosas en las que vas a trabajar) son buenos candidatos para las clases. Sus verbos (las acciones que planea tomar en estos nombres) son buenos candidatos para los métodos.

    Como dije, estoy seguro de que la respuesta mejor formada está por aquí en alguna parte. Así es como trato de pensarlo.

    Lo último, si un método parece demasiado complejo, probablemente lo sea, y probablemente funcione mejor dividido en múltiples métodos.

    Espero que eso ayude.

    Por un lado, la práctica hace perfecto. Se volverá mucho más fluido después de algunos años de hacerlo.

    Pero, por otro lado, incluso cuando te vuelves bueno, siempre habrá momentos en los que es difícil convertir algo en código, y necesitas un método para hacerlo.

    En ese caso, lo que hago es desglosar lo que estoy tratando de hacer (es decir, un algoritmo complejo o un conjunto de pasos) en partes. Escribo estas partes en comentarios como este:

    // 1. Conectarse a la base de datos

    // 2. Extraer el conjunto de datos XYZ

    // 3. Hacer la normalización de XYZ

    // 4. Proceso XYZ

    // 5. Almacenar XYZ de nuevo en la base de datos

    Luego relleno cada pieza. Si una pieza es demasiado complicada, también la rompo.

    Hacerlo de esta manera hace que sea fácil encontrar lugares para minimizar la reutilización del código y dónde crear métodos, etc., en lugar de tratar de luchar y hacerlo todo de una vez.

    Solo sigue rompiéndolo hasta que sea manejable, luego escribe cada pieza bien.