«El problema que se plantea puede ser modesto; pero si pone a prueba la curiosidad que induce a poner en juego las facultades inventivas, si se resuelve por propios medios, se puede experimentar el encanto del descubrimiento y el goce del triunfo» George Polya
Hoy vamos a empezar con el primer post de una serie de «apuntes» teóricos que nos ayudaran en el proceso de aprendizaje de programación, en este caso de Python, aunque estos conceptos también son aplicables a otros lenguajes de programación.
Hay varias definiciones y conceptos que no se plasmarán en estos apuntes, ya que están muy bien explicados en los post originales del Taller de juegos
Hoy toca escribir sobre un concepto que en principio puede resultar simple de comprender, pero como ya se ha dicho por aquí, llevado a la práctica está controlando nuestras vidas hoy en día más de lo que creemos y queremos.
Algoritmos
¿Qué son?
Un algoritmo es un método preciso de describir la solución de un problema, explicando como se debe proceder para llegar a una respuesta encuadrada a los datos disponibles, en un tiempo finito.
Sus principales características son:
Debe ser preciso: es decir, que debe indicar sin ambigüedades cada paso a seguir para conseguir el objetivo propuesto.
Debe ser exacto: en caso de seguir el algoritmo con el mismo juego de datos repetidamente, los resultados deben ser los mismos.
Debe ser finito: de tiempo finito, osea que su ejecución debe concluir en algún momento.
Por lo general, uno de los ejemplos más comunes de un algoritmo, es una receta de cocina. Cómo podría ser un algoritmo que describa el proceso de hacer puré de papa, puedo describir detalladamente el proceso de realizar un puré de papa. Pero puede que quien está leyendo no necesite las instrucciones específicas y detalladas, y con el simple algoritmo: 1) Hacer un puré de papa. Ya sea capaz de realizar la tarea.
Esto nos demuestra que la redacción de un algoritmo dependerá del «procesador» que lo va a ejecutar.
Un procesador es aquel sujeto o máquina que puede entender un enunciado y ejecutar el trabajo indicado en el mismo. La sintaxis y semántica necesarias para escribir el algoritmo, dependerá del lenguaje que este conozca. Entonces frente a un problema, dependiendo de quien sea el procesador y el lenguaje en el que se comunique, podremos escribir la solución mediante un algoritmo que pueda entender y ejecutar sin ambigüedades.
Acciones primitivas y no primitivas
Las acciones primitivas son las que el procesador puede interpretar y ejecutar. La acción no primitiva debe ser descompuesta en acciones primitivas.
En el caso del taller que nos compete, el «procesador» será una computadora que pueda interpretar el lenguaje Python. Sin embargo, para un gran número de tareas de uso corriente, las acciones primitivas son similares en los distintos lenguajes, lo que permite desarrollar algoritmos que sean independientes del lenguaje.
Con estos conceptos claros, podemos decir que un programa es un algoritmo traducido a algún lenguaje que pueda ser entendido por una computadora para poder ejecutarlo. Y para llegar a hacer un programa es necesario el diseño previo del algoritmo.
Por ahora lo dejamos aquí, luego en otro post veremos formas de representar algoritmos, diagramas de flujo, pseudocódigo, y alguna que otra técnica para diseñarlos. Y por supuesto iremos aporreándonos con conceptos más específicos del lenguaje Python.
Para cualquier duda, consulta personal, o ver como vamos con la práctica, puedes utilizar los métodos de comunicación detallados en nuestro PAD.
To be continued…
Lo siento, pero esa definición de algoritmo es mayormente incorrecta:
En todo caso se puede ajustar a la definición de función pura (funcion de programacion o función matematica) la cual siempre debe producir la misma salida para la misma entrada.
https://www.campusmvp.es/recursos/post/programacion-funcional-inmutabilidad-y-funciones-puras.aspx
Lo que parece indicar que se están confundiendo ambos conceptos. Y aunque una función es aconsejable que haga una única tarea, no tiene necesariamente porqué y un algoritmo puede perfectamente ser la combinación de varias funciones (puras o no)
Un algoritmo puede emplear la evaluación de datos aleatorios o incluir estrategias para aproximar el resultado cuando el problema a tratar tiene una complejidad por encima de nuestra capacidad de computación, por ejemplo, los algoritmos genéticos aplicados al problema del viajante:
https://es.wikipedia.org/wiki/Algoritmo_gen%C3%A9tico
http://castrovation.blogspot.com/2016/02/algoritmo-genetico-problema-del-viajante.html
Decir que un algoritmo debe dar una solución exacta, es simplemente, incorrecto. Decir que un algoritmo debe producir la misma salida para la misma entrada, tambien es incorrecto.
Hay muchos casos donde un algoritmo puede producir una salida diferente para la misma entrada, el ejemplo mas claro es un algoritmo que genere números pseudoaleatorios o por extension, un algoritmo que genere uuid’s
https://es.wikipedia.org/wiki/Identificador_%C3%BAnico_universal
Por otra parte, los datos o las acciones «primitivas» no dejan de ser una abstracción que aporta el lenguaje de programación y que no tiene nada que ver con la ISA del procesador.
https://es.wikipedia.org/wiki/Conjunto_de_instrucciones
De hecho, un lenguaje como python puede tener primitivas como la lista, que a su vez esta construido sobre primitivas de C, que a su vez luego son compiladas en código máquina que si harán uso de la ISA.
Esta muy bien divulgar, enseñar y compartir el conocimiento. Pero entradas como ésta creo que solo sirven para confundir y desinformar al personal.
Un saludo.
Lo siento, pero esa definición de algoritmo es mayormente incorrecta:
En todo caso se puede ajustar a la definición de función pura (funcion de programacion o función matematica) la cual siempre debe producir la misma salida para la misma entrada.
https://www.campusmvp.es/recursos/post/programacion-funcional-inmutabilidad-y-funciones-puras.aspx
Lo que parece indicar que se están confundiendo ambos conceptos. Y aunque una función es aconsejable que haga una única tarea, no tiene necesariamente porqué y un algoritmo puede perfectamente ser la combinación de varias funciones (puras o no)
Un algoritmo puede emplear la evaluación de datos aleatorios o incluir estrategias para aproximar el resultado cuando el problema a tratar tiene una complejidad por encima de nuestra capacidad de computación, por ejemplo, los algoritmos genéticos aplicados al problema del viajante:
https://es.wikipedia.org/wiki/Algoritmo_gen%C3%A9tico
http://castrovation.blogspot.com/2016/02/algoritmo-genetico-problema-del-viajante.html
Decir que un algoritmo debe dar una solución exacta, es simplemente, incorrecto. Decir que un algoritmo debe producir la misma salida para la misma entrada, tambien es incorrecto.
Hay muchos casos donde un algoritmo puede producir una salida diferente para la misma entrada, el ejemplo mas claro es un algoritmo que genere números pseudoaleatorios o por extension, un algoritmo que genere uuid’s
https://es.wikipedia.org/wiki/Identificador_%C3%BAnico_universal
Por otra parte, los datos o las acciones «primitivas» no dejan de ser una abstracción que aporta el lenguaje de programación y que no tiene nada que ver con la ISA del procesador.
https://es.wikipedia.org/wiki/Conjunto_de_instrucciones
De hecho, un lenguaje como python puede tener primitivas como la lista, que a su vez esta construido sobre primitivas de C, que a su vez luego son compiladas en código máquina que si harán uso de la ISA.
Esta muy bien divulgar, enseñar y compartir el conocimiento. Pero entradas como ésta creo que solo sirven para confundir y desinformar al personal.
Un saludo.
Hola darco, mola tanta información que aportas pero tan a la ligera en estos conceptos decir desinformación me parece un poco precipitado.Me parece sumamente interesante la info. ¿Por qué no te sumas a la sala del XMPP y lo debatimos tranquilamente ? proyectos[arroba]salas.xmpp.elbinario.net te esperamos :)
Hola darco. Gracias por tu comentario. Creo que probablemente no me exprese, o explique de la mejor manera. Veo que tu mayor duda es con la caracteristica de «exactitud». Esto no refiere a que un algoritmo debe dar una solucion «exacta». Ni que debe producir la misma salida para la misma entrada. Volvi a leer el post un par de veces y no veo donde esta escrito eso. Esta caracteristica se refiere a algo mas simple. Que es que un algoritmo no puede dar un resultado para el cual no este diseñado. Como tu ejemplo de un algoritmo que genere numeros «pseudoaleatorios», Esta diseñado para que su salida sea esa y no letras «pseudoaleatoreas», por dar un ejemplo burdo. Entonces como se dice en el post: » en caso de seguir el algoritmo con el mismo juego de datos repetidamente, los resultados deben ser los mismos.» Si el algoritmo esta bien diseñado, los resultados seran los mismos, numeros «pseudoaleatorios».
Veo que tambien tuviste conflicto con el tema de las «acciones primitivas». No se habla de un tipo de dato computacional primitivo. Es un concepto mas abstracto, que se refiere a una calificacion de acciones que pueda realizar un «procesador» . Y con «procesador» no se esta refiriendo especificamente a la Unidad Central de Procesamiento sino, como dice en el post, «Un procesador es aquel sujeto o máquina que puede entender un enunciado y ejecutar el trabajo indicado en el mismo». Son definiciones que apuntan al entendimiento de un algoritmo como algo no exclusivo del pensamiento computacional. Si tienes otras dudas, o aportes que creas utiles sentite libre de comentarlos. El personal te lo agradece :)
Ganas de marear la perdiz, es posible que el algoritmo no tenga que ser exacto, lo que si está claro es que tiene que tener exactitud en cuanto al resultado esperado. Y además un algoritmo genético no es más que un conjunto de algoritmos, aplicados para conseguir exactamente lo que queremos que nunca se comporte de la misma manera y mejore, pero igualmente tiene inputs y outputs, y además tienen un fin, la optimización.
Así que si programo un algoritmo genético para que optimice algo, el resultado será la propia optimización y eso si es exactamente lo que se espera del algoritmo y/o conjunto de algoritmos que componen el algoritmo genético.
Gracias. Me gustan estas iniciativas, me dan ánimo para empezar a aprender Python para ver si puedo adentrarme y conocer un poco más el navegador de archivos Ranger, que me gusta mucho.
Interesante debate. Completa el post perfectamente.