Skip to content
Snippets Groups Projects
Commit e5b3c577 authored by Sebastian Ordoñez's avatar Sebastian Ordoñez
Browse files

Notebook with the second exercise added.

parent 5b6d27d9
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
# Ejercicio No. 2 - Triángulo de Pascal
**Enunciado:**
- 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.
- Modifique la rutina anterior para que reciba un número variable de argumentos: $n_1$, $n_2$, $n_3$,...
y retorne una lista cuyo primer elemento es una lista conteniendo los números en la fila $n_1$
del triángulo de Pascal, el segundo elemento una lista con los números en la fila $n_2$, y así
sucesivamente.
**Solución:** Hola, mi nombre es Sebastian Ordoñez (ordonezs). Para solucionar este ejercicio decidí hacer uso de la expresión conocida en términos de combinatorias para los elementos de la $n$-ésima fila. ASí pues, implemente una pequeña función auxiliar para calcular la combinatoria entre dos números y luego la usé para los propósitos específicos del triángulo.
%% Cell type:markdown id: tags:
## Primera parte
Primero se importa la libreria `math`, de la cual será útil especialmente la función que calcula el factorial de un entero positivo dado.
%% Cell type:code id: tags:
``` python
import math
```
%% Cell type:markdown id: tags:
Ahora, con el fin de usar la expresión matemática conocida para los elementos del triángulo de Pascal, se implementa una función auxiliar que permite calcular la combinatoria entre dos enteros positivos, $n$ y $k$, tal que $0\leq k\leq n$ y su expresión está dada por $nCk = \frac{n!}{k!(n-k)!}$.
%% Cell type:code id: tags:
``` python
def combinatory(n:int, k:int)->int:
"""
Esta fucnión calcula la combinatoria entre dos enteros dados.
Input
------
n (int): entero positivo mayor que k.
k (int): entero positivo menor que n.
Output
------
comb (int): entero resultante de hacer la combinación entre n y k.
"""
if k>n or n<0 or k<0: # Condición matemática para que la operación factorial esté bien definida.
return "Recuerde que el segundo argumento ha de ser mayor que el primero y ambos positivos."
else:
f = math.factorial
comb = int(f(n)/(f(k)*f(n-k))) # Definición de combinatoria
return comb
```
%% Cell type:markdown id: tags:
Con el fin de completar lo requerido por el ejercicio se implementa la función principal `pascalTriangle`, la cual hace uso del hecho que la entrada de la $n$-ésima fila del triángulo en la posición $k$-ésima, está dada por $nCk$. Para más detalles consulte [aquí](https://en.wikipedia.org/wiki/Pascal%27s_triangle#Formula).
%% Cell type:code id: tags:
``` python
def pascalTriangle(n:int)->list:
"""
Esta función recibe un número natural n y retorna los elementos de la n-ésima fila del triángulo de Pascal.
La notación es tal que las primeras posiciones comienzan en cero.
Input
------
n (int): número que se espera que sea entero.
Output
------
triangleRow (list): lista de números que corresponden a la n-ésima fila del triángulo de Pascal.
"""
if type(n)!= int or n<0:
return "The number you gave is either non integer or is less than zero."
else:
triangleRow = []
for k in range(n+1):
triangleRow.append(combinatory(n,k))
return triangleRow
```
%% Cell type:markdown id: tags:
Ahora podemos probar la función principal para los casos triviales y algunos más complicados.
%% Cell type:code id: tags:
``` python
print(pascalTriangle(0))
print(pascalTriangle(1))
print(pascalTriangle(2))
print(pascalTriangle(3))
print(pascalTriangle(4))
print(pascalTriangle(5))
print(pascalTriangle(6))
```
%% Output
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
%% Cell type:markdown id: tags:
## Segunda parte
Continuando con la segunda parte del ejercicio, se procede a extender la función `pascalTriangle` a múltiples argumentos.
%% Cell type:code id: tags:
``` python
def pascalTriangleExtended(*args)->list:
"""
Esta función recibe un número no definido de argumentos que se espera que correspondan a números naturales.
Input
------
*args: lista de argumentos con longitud no definida los cuales se espera que correspondan a números naturales.
Output
------
allRows (list): lista que contiene listas, las cuales corresponden a las filas del triángulo de Pascal asociadas
a los argumentos dados n1, n2, n3, etc.
"""
allRows = []
for jj in args:
if type(jj)!=int or jj<0:
return "At least one of the numbers you gave is either non integer or is less than zero."
break
else:
triangleRow = []
for k in range(jj+1):
triangleRow.append(combinatory(jj,k))
allRows.append(triangleRow)
return allRows
```
%% Cell type:markdown id: tags:
Podemos ahora comprobar la utilidad de esta nueva función `pascalTriangleExtended` usando como ejemplo algo que se hizo arriba en la primera parte en varias líneas.
%% Cell type:code id: tags:
``` python
pascalTriangleExtended(0,1,2,3,4,5,6)
```
%% Output
[[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1]]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment