La forma más básica de hacerlo (si no puede encontrar algo que ya haya resuelto el problema antes) es reducir el problema a problemas más pequeños. Para cada uno de estos, vea si puede idear algún algoritmo para lograrlo, si no reducirlo aún más. Continúe hasta que tenga todas las partes que puedan estipularse expresamente en algún algoritmo formal ejecutable en cualquier dispositivo que vaya a ejecutar.
Probemos con un problema aparentemente simple: por ejemplo, digamos que deseas que algún robot te prepare una taza de café instantáneo. Primera división: hierva agua, agregue café (y otros) en la taza, vierta agua, revuelva, ¿algo de leche?
¿El robot va a entender eso? Probablemente no. Así que tome cada turno … comencemos por hervir el agua … divídalo aún más: coloque el hervidor debajo del grifo, abra el grifo, cierre cuando haya suficiente agua, enchufe el hervidor, encienda, espere hasta que hierva.
- ¿Se necesitarán estructuras de datos y algoritmos para los ingenieros de diseño analógico o EDA?
- ¿Cuáles son algunos buenos tutoriales que dividen, conquistan y analizan los algoritmos más complejos jamás diseñados?
- ¿Qué técnica general siguen los autores al escribir libros técnicos en LaTeX?
- ¿Qué algoritmos y estructuras de datos debo aprender para ZCO e INOI?
- Cómo implementar este problema: Problema - C - Fuerzas de código
Lo suficientemente lejos todavía? No, el robot ni siquiera entiende hervidor o grifo. Así que continúe, divida “Ponga el hervidor debajo del grifo”: Levante el hervidor de la mesa, gire el brazo para que el hervidor quede debajo del grifo. Aún más: abra la mano, mueva el brazo de manera que la mano esté alrededor del mango de la caldera, cierre la mano hasta que la presión sea suficiente, mueva la mano hacia arriba para levantar, …
Incluso eso no es exactamente suficiente todavía. Probablemente, la “mano abierta” probablemente sea un conjunto completo de instrucciones sobre a qué servos enviar la potencia. Además, en cada una de las divisiones, intente encontrar alguna otra cosa ya realizada que logre eso, aunque solo una le ahorre mucho tiempo, por ejemplo, alguien probablemente ya haya escrito algo para “mano cercana”.
¿Te dan la imagen? Algunas tareas pueden sonar “simples”, pero al diseñar un algoritmo para lograrlas (especialmente cuando dicho algo necesita ejecutarse a través de una computadora completamente “estúpida”) se vuelve cada vez más detallado y complejo. Cada subtarea individual es cada vez más simple en sí misma, pero crecen exponencialmente. Es por eso que la mayoría de los cursos comienzan con tareas verdaderamente simples y / o “estúpidas”; de lo contrario, este paso de traducción de problema a algoritmo podría llevar meses o años (no es una buena idea enseñarle a alguien).
Con experiencia, tiende a descubrir que comienza a saltar más rápidamente varias capas de división. También comienzas a recordar cosas que has hecho anteriormente, lo que significa que pierdes menos tiempo buscando posibles cosas prefabricadas (ya que probablemente las hiciste tú mismo antes).