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 

Copyleft 2006 Juanjo Conti