Identificación

Usuario: vivasm.
Nombre: Mariana Vivas.
Institución: Universidad Central de Venezuela.

Ejercicio 2 - Triángulo de Pascal

  1. Escriba una rutina en python que reciba como entrada un número entero, $n$, e imprima los números en la $n$-ésima fila del triángulo de Pascal. El programa debe verificar si el número n es entero, o arrojar un mensaje informando que ha habido un error del usuario en caso contrario.
  2. Modifique la rutina anterior para que reciba un número variable de argumentos: n1, n2, n3,… y retorne una lista cuyo primer elemento es una lista conteniendo los números en la fila n1 del triángulo de Pascal, el segundo elemento una lista con los números en la fila n2, y así sucesivamente.

Solución

  1. Para calcular la enésima fila del triángulo de Pascal:

Pascal

utilizaremos que se puede escribir con los coeficientes binomiales

Pascalbinomial

Donde: $${n\choose k}=\frac{n!}{k!(n-k)!}$$

Por lo tanto, para calcular, por ejemplo, la tercera ($n=3$) fila del triangulo de Pascal, tenemos que calcular: $$ \begin{align} {3\choose 0} && {3\choose 1} && {3\choose 2} && {3\choose 3} \end{align} $$

In [1]:
# Importamos la librería 'math' para utilizar la función 'factorial'
import math

# Definimos una función que calcule el coeficiente binomial:
def nCk(n,k):
    return int(math.factorial(n)/(math.factorial(k)*math.factorial(n-k)))

Comprobamos que la función de el valor correcto de la combinatoria

In [2]:
nCk(5,2)

Definimos la función que calcule los valores de la combinatoria para la n-ésima fila:

In [3]:
def fila(n):
    fila=[] #para guardar la fila
    
    #nos aseguramos que se haya insertado un número entero
    try:
        value = int(n)
        
        #calculamos los valores de las combinatorias 
        for ii in range(value): 
            fila.append(nCk(value-1,ii)) #value-1 porque la primera fila es la combinatoria de {0,0}
            
        #imprimimos los números separados por espacios
        print(' '.join(str(jj) for jj in fila))
    except: 
        print("Debe ser un número entero") 

Comprobamos que la función arroja los valores deseados:

In [4]:
value=input('Inserte el número de fila: ') #el número insertado por el usuario
fila(value)
Inserte el número de fila: 4
1 3 3 1

Comprobamos que si se inserta algo distinto a un numero entero la función arroja el mensaje esperado:

In [5]:
value=input('Inserte el número de fila: ') #el número insertado por el usuario
fila(value)
Inserte el número de fila: hola
Debe ser un número entero
  1. Para que el usuarion inserte las filas que desea del triángulo de Pascal, utilizaremos expresiones regulares:
In [6]:
import re
val=input('Inserte las filas del triangulo de pascal que desea (ej: 2,3,5): ')
lista=[int(s) for s in re.findall(r'\b\d+\b', val)]

#\b es el principio o final de la palabra
#\d+ entero de uno o más dígitos
Inserte las filas del triangulo de pascal que desea (ej: 2,3,5): 2,4,5,hola,8

Nos aseguramos que la variable 'lista' contiene los números de tipo 'int' insertados por el usuario:

In [7]:
print('{} tiene entradas de tipo {}'.format(lista,[type(item) for item in lista]))
[2, 4, 5, 8] tiene entradas de tipo [<class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>]

Utilizamos el código del item 1 y lo convertimos en una función que devuelva la fila del valor insertado:

In [8]:
def pascalfila(n):
    fila=[] #guardamos los valores de la fila
    for ii in range(n):
        fila.append(nCk(n-1,ii)) #insertamos los valores de las combinatorias en la lista
    return(fila)

Utilizamos esta función con un loop para obtener una lista de listas:

In [9]:
final=[] #la lista de las filas

for ii in lista:
    final.append(pascalfila(ii)) #insertamos la lista de los valores de cada fila
print(final) 
[[1, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 7, 21, 35, 35, 21, 7, 1]]