Implementación de Algoritmos Fundamentales en Python: Hanoi, Fibonacci y Métodos de Ordenamiento
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 4,95 KB
Algoritmos Recursivos Clásicos
Torres de Hanoi
Implementación recursiva para resolver el problema clásico de las Torres de Hanoi.
def hanoi(n, inicial, final, libre):
if n == 1:
print('mover disco superior de aguja', inicial, 'a', final)
else:
hanoi(n - 1, inicial, libre, final)
print('mover disco superior de aguja', inicial, 'a', final)
hanoi(n - 1, libre, final, inicial)Complejidad Temporal
El número de movimientos requeridos es (2n) - 1 iteraciones.
Sucesión de Fibonacci
Diferentes métodos para calcular el n-ésimo término de la secuencia de Fibonacci.
Implementación Recursiva (fiboR)
def fiboR(n):
if n == 1 or n == 2:
return 1
return fiboR(n - 1) + fiboR(n - 2)Implementación Iterativa (fiboI)
def fiboI(n):
a, b = 1, 1
for i in range(3, n + 1):
a, b = b, a + b
return bImplementación por Fórmula de Binet (fiboFormula)
def fiboFormula(n):
from math import sqrt
z = 1 / sqrt(5) * (((1 + sqrt(5)) / 2) ** n - ((1 - sqrt(5)) / 2) ** n)
return int(z)Estructuras de Datos y Lógica Binaria
Rastreo de Ascendencia Binaria
Este segmento de código utiliza la representación binaria de un número para simular un rastreo de ascendencia (Padre/Madre).
a = int(input('Numero de apellido:'))
lista = list(bin(a - 1)[2:])
for dato in lista:
if dato == '0':
print('PADRE', end=' ')
else:
print('MADRE', end=' ')Algoritmos de Ordenamiento (Sorting)
Ordenamiento por Burbuja (Bubble Sort)
def ordenar_bur(l):
for P in range(len(l) - 1):
for i in range(len(l) - 1 - P):
if(l[i] > l[i + 1]):
aux = l[i]
l[i] = l[i + 1]
l[i + 1] = aux
return lOrdenamiento por Inserción (Insertion Sort)
def ord_insertando(l):
for j in range(1, len(l)):
i = j - 1
temp = l[j]
while(i > -1 and l[i] > temp):
l[i + 1] = l[i]
i = i - 1
l[i + 1] = temp
return lOrdenamiento por Mezcla (Merge Sort)
Función de Mezcla (Merging)
def mezclando(izq, der):
lord = []
i = 0
j = 0
while i < len(izq) and j < len(der):
if izq[i] < der[j]:
lord.append(izq[i])
i = i + 1
else:
lord.append(der[j])
j = j + 1
lord = lord + izq[i:]
lord = lord + der[j:]
return lordFunción Principal de Merge Sort (Recursiva)
def ord_mezclando(l):
if len(l) < 2:
return l
else:
mitad = len(l) // 2
izq = ord_mezclando(l[:mitad])
der = ord_mezclando(l[mitad:])
return mezclando(izq, der)Generación de Combinaciones
Permutaciones de Paréntesis
Generación de secuencias de paréntesis (aunque la implementación puede no garantizar todas las combinaciones balanceadas).
def perm(n):
a = ['()']
for i in range(n - 1):
b = a[:]
a = []
for x in b:
a.append('(' + x + ')')
a.append('()' + x)
return aProcesamiento de Datos y Utilidades de Fecha
Cálculo de Edad a partir de Fechas
Función que calcula la edad de una persona dada su fecha de nacimiento (cadena_cumple) y la fecha actual (asumida como variable global FECHA).
def edad(cadena_cumple):
lc1 = cadena_cumple.split('-')
lc2 = FECHA.split('-')
a1 = int(lc1[2])
a2 = int(lc2[2])
m1 = int(lc1[1])
m2 = int(lc2[1])
d1 = int(lc1[0])
d2 = int(lc2[0])
# Comprueba si ya ha cumplido años este año
if(m1 < m2 or (m1 == m2 and d1 <= d2)):
return a2 - a1
else:
return a2 - a1 - 1Ejemplo de Procesamiento de Archivo de Datos
El siguiente código lee datos estructurados de skype_datos.txt (asumiendo un formato de etiqueta/valor alternado) y calcula la edad de los registros, escribiendo los resultados en solucion_ej_4.txt.
i = 1
l = []
l2 = ['', '', '']
f = open('skype_datos.txt', 'r')
for linea in f:
if i % 2 != 0:
etiq = linea.strip()
else:
if etiq == 'USUARIO':
l2[0] = linea.strip()
elif etiq == 'LUGAR':
l2[1] = linea.strip()
else: # Asumiendo que es el campo de fecha de nacimiento
l2[2] = linea.strip()
if i % 6 == 0:
l.append(l2)
l2 = ['', '', '']
i += 1
f.close()
print(l)
FECHA = input('dame fecha de hoy DD-MM-AAAA')
f2 = open('solucion_ej_4.txt', 'w')
for subl in l:
n = edad(subl[2])
f2.write(str(n) + '\n')
f2.close()