Logo Studenta

ALGORITMOS PYTHON-páginas-4

¡Estudia con miles de materiales!

Vista previa del material en texto

[17]
lenguajes para comenzar a programar, –ya que es como programar en pseudocódigo–, y la curva de 
aprendizaje es bastante alta y rápida.
Es una tecnología muy utilizada en la actualidad, por su simplicidad y potencia permite realizar 
aplicaciones de una manera rápida, sencilla y óptima para el despliegue en distintas plataformas, 
además permite utilizar algoritmos de machine learning e inteligencia artificial en producción. Exis-
ten muchos casos de grandes empresas que utilizan Python en sus aplicaciones con gran éxito, tal 
es el caso de Google, la NASA, Netflix, Mercado libre, Spotify, Dropbox, Instagram, Pinterest, Glo-
bant, Sattelogic y un largo etcétera.
Un lenguaje interpretado o de script es aquel que se ejecuta utilizando un programa intermedio 
llamado intérprete, en lugar de compilar el código a lenguaje máquina que pueda comprender y 
ejecutar directamente una computadora. La ventaja de los lenguajes compilados es que su ejecu-
ción es más rápida. Sin embargo los lenguajes interpretados son más flexibles y más portables.
Python tiene, no obstante, muchas de las características de los lenguajes compilados, por lo que se 
podría decir que es seminterpretado. En Python, como en Java, Delphi y muchos otros lenguajes, el 
código fuente se traduce la primera vez que se ejecuta a un pseudocódigo máquina intermedio llama-
do bytecode, generando archivos “.pyc” o “.pyo”, que son los que se ejecutarán en sucesivas ocasiones.
La característica de tipado dinámico se refiere a que no es necesario declarar el tipo de dato que va 
a contener una variable, sino que su tipo se determinará en tiempo de ejecución según el tipo del 
valor al que se asigne, y el tipo de esta variable puede cambiar si se le asigna un valor de otro tipo, 
lo cual le otorga una gran flexibilidad a la hora de programar.
En los lenguajes con esta característica no se permite tratar a una variable como si fuera de un tipo 
distinto al que tiene, es necesario convertir de forma explícita dicha variable al nuevo tipo previa-
mente. Por ejemplo, si tenemos una variable que contiene un texto (variable de tipo cadena o string) 
no podremos tratarla como una variable numérica, sin previamente realizar una conversión.
La programación orientada a objetos es un paradigma en el que los conceptos del mundo real rele-
vantes para nuestro problema se trasladan a clases y objetos en nuestro programa. La ejecución del 
programa consiste en una serie de interacciones e intercambio de mensajes entre los objetos. No 
obstante el lenguaje soporta también los paradigmas de programación imperativa y funcional (este 
último le permite al lenguaje añadir características avanzadas muy interesantes).
El intérprete de Python está disponible en muchas plataformas de las más comunes (Linux, UNIX, 
Mac OS, Solaris, DOS, Windows, etc.) por lo que si no utilizamos librerías específicas de cada plata-
forma nuestro programa podrá correr en todos estos sistemas sin tener que realizar ningún tipo de 
cambio. Esto nos permite desarrollar programas que sean portables de un sistema operativo a otro.
La filosofía de los creadores de Python entiende que la gran sencillez, flexibilidad y potencia del 
lenguaje debe ir acompañada de una correcta formación del programador que lo utiliza para poder 
realizar las actividades de desarrollo con criterio, dado que la inexperiencia de los nuevos progra-
madores puede conducirlos a programar de manera incorrecta (aunque lleguen a un resultado).
[19]
CAPÍTULO II
Auto llamadas con 
algoritmos recursivos
Cuando se habla de recursividad se hace referencia a problemas en los cuales, dicho problema 
es parte de la solución. Se trata de un modelo matemático cuya definición incluye a sí mismo “se 
autodefine”; es decir que se llama a sí misma repetidamente hasta que satisface una determinada 
condición para evitar caer en un bucle infinito, y donde cada resultado depende de la resolución 
de la siguiente o anterior repetición, hasta alcanzar dicha condición de fin. Entonces, este modelo 
recursivo tiene dos características fundamentales para ser denominado como tal:
1. Debe tener al menos una condición clara de fin o caso base del problema, puede tener más de 
una de ser necesario.
2. Debe llamarse a sí mismo, es decir que el modelo o solución sea parte de su propia definición. 
Esta llamada puede ser única, si se llama una sola vez dentro de la función, o múltiple, si se 
realizan más de una llamada.
Figura 1. Definición gráfica de recursividad
A partir de esta definición, se puede decir que la recursividad es una técnica muy útil para desarro-
llar algoritmos recursivos que den solución a distintos problemas. Este modelo recursivo se lo debe 
pensar como una función recursiva que servirá para dar solución a ciertos problemas –estos son 
casos particulares donde la naturaleza del problema es recursiva–. No cualquier problema puede 
resolverse de forma recursiva, aunque muchas veces puede implementarse una solución recursiva 
para problemas que no son de esta naturaleza. Es importante aclarar que dentro de una función o 
algoritmo recursivo no deben existir ciclo o bucles, salvo algunos casos muy particulares para resol-
ver alguna operación transversal a la función.
[20]
Se puede clasificar la recursividad de acuerdo a su tipo, pueden ser algoritmos recursivos directos 
o indirectos, los primeros se llaman a sí mismos mientras que los segundos llaman a un algoritmo 
(intermedio) y este llama al algoritmo inicial para generar la recursividad. Otra manera de clasifi-
carla es respecto a la finalización de los algoritmos si son finales o no finales, es decir, si al finalizar 
las llamadas recursivas no queda más nada por hacer o aún quedan instrucciones por ejecutar.
Para comenzar, podemos observar un ejemplo sencillo: el problema del factorial, si se quiere calcu-
lar el factorial de un número n. La solución iterativa sería la siguiente (si n=5):
5! = 5 * 4 * 3 * 2 * 1
Pero si se lo piensa de forma recursiva, es decir, si se descompone el problema inicial en pequeños 
subproblemas y se resuelve una parte del problema en cada llamada (que quedará pendiente hasta 
que se alcance el caso base del problema), entonces se podría resolver de la siguiente manera:
5! = 5 * 4! → Llamada recursiva
De esta forma, la solución al problema anterior quedaría así:
Problema Solución parcial Solución
5! 5 * 4! (pendiente en espera de 
solución de 4!)
Llamada recursiva 4!
4! 4 * 3! (pendiente en espera de 
solución de 3!)
Llamada recursiva 3!
3! 3 * 2! (pendiente en espera de 
solución de 2!)
Llamada recursiva 2!
2! 2 * 1! (pendiente en espera de 
solución de 1!)
Llamada recursiva 1!
1! 1 * 0! (pendiente en espera de 
solución de 0!)
Llamada recursiva 0!
0! 0! = 1 (condición de fin o 
caso base)
1
Una vez que se alcanza la condición de fin, se empiezan a resolver las llamadas recursivas previas 
que quedaron pendientes.
Problema Solución parcial Solución
0! 0! 1 (condición de fin o caso base)
1! 1 * 0! 1 * 0! → 1 * 1 = 1 (utilizando resultado de 0!)
2! 2 * 1! 2 * 1! → 2 * 1 = 2 (utilizando resultado de 1!)
3! 3 * 2! 3 * 2! → 3 * 2 = 6 (utilizando resultado de 2!)
4! 4 * 3! 4 * 3! → 4 * 6 = 24 (utilizando resultado de 3!)
5! 5 * 4! 5 * 4! → 5 * 24 = 120 (utilizando resultado de 4!)

Continuar navegando