download: tartaglia.py
#!/usr/bin/python2.3
# Triangulo de Tartaglia o Triangulo de Pascal:
# 1 - Solucion recursiva:
def sumaDeADos(nlist): # funcion auxiliar [1, 2, 3, 4] --> [3, 5, 7]
rta = []
for a in range(len(nlist) -1):
rta.append(nlist[a] + nlist[a+1])
return rta
def tartaglia(n=1):
if n==1: return [1]
elif n==2: return [1, 1]
else: return [1] + sumaDeADos(tartaglia(n-1)) + [1]
for t in range(1,15):
print tartaglia(t) # por cada nivel se vuelven a
# calcular los anteriores niveles :-(
# En la solucion anterior se codifico un metodo que retorna
# una linea o nivel especifico del triangulo de tartaglia
# y se uso este para dibujar un triangulo de 15 niveles.
# Como el objetivo es dibujar un triangulo vamos a aprovechar
# toda la informacion obtenida al buscar la n-esima linea para
# poder mostrar todas las anteriores.
# 2 - Solucion reursiva que no hace calculos innecesarios:
def tartaglia2(): # wrapper de tartaglia2Aux()
print [1]
nivel = [1,1]
tartaglia2Aux(nivel) # la variable 'nivel' hace referencia
# a los niveles del triangulo
def tartaglia2Aux(nivel):
if len(nivel) < 15: # se define la altura del triangulo
print nivel
aux = []
for a in range(len(nivel) -1):
aux.append(nivel[a] + nivel[a+1])
aux = [1] + aux + [1]
tartaglia2Aux(aux)
tartaglia2()
# 3 - Como el caso anterior presenta una recursividad simple
# por la cola, la solucion puede llevarse a una forma iterativa.
# Algunos interpretes/compiladores como el de Scheme optimizan los
# casos de recursividad por la cola, pero Python no:
def tartaglia3(): # wrapper de tartaglia3Aux()
print [1]
nivel = [1,1]
tartaglia3Aux(nivel)
def tartaglia3Aux(nivel):
for t in range(3,16): # se define la altura del triangulo
print nivel
aux = []
for a in range(len(nivel) -1):
aux.append(nivel[a] + nivel[a+1])
aux = [1] + aux + [1]
nivel = aux
tartaglia3()
# Pero estas 3 implementaciones no difieren mucho de como
# se podria haber escrito en otro lenguaje como C, no estoy
# usando ninguna de las facilidades que provee Python
# La parte del algoritmo que suma de a dos los numeros de una
# lista de longitud n y devuelve una lista de longitud n-1
# puede escribirse como el mapeo de la funcion suma (add) sobre
# dos porciones de la lista original, una con todos los elementos
# menos el ultimo y una con todos los elementos menos el primero.
def sumaDeADosPyWay(nlist):
from operator import add
return map(add, nlist[1:], nlist[:-1])
# print sumaDeADosPyWay([1])
# print sumaDeADosPyWay([1, 2, 3, 4, 5])
def tartaglia4(nivel=[1]):
if len(nivel) < 15:
print nivel
nivel = [1] + sumaDeADosPyWay(nivel) + [1]
tartaglia4(nivel)
tartaglia4()
tartaglia4([1,2,1])
# żMas variantes o mejoras? Dejen sus comentarios en mi blog
# http://www.juanjoconti.com.ar o mandenmen un mail a jjconti@gnu.org