<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="c1"># calculo cada uno de los coeficientes binomiales y lo almaceno en fila </span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span> <span class="c1"># calculo cada uno de los coeficientes binomiales y lo almaceno en fila </span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Error: el número ingresado no es entero'</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Error: el número ingresado no es entero'</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="c1"># sabemos que la primera fila es un 1</span>
<span class="k">elif</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="c1"># sabemos que la primera fila es un 1</span>
" \"\"\"Prints the n-row of Pascal's triangle.\"\"\"\n",
" if int(n)==n: # reviso que el número sea entero\n",
" if int(n)==n: # reviso que el número sea entero\n",
" row = ''\n",
" row = ''\n",
" for i in range(n+1): # calculo cada uno de los coeficientes binomiales y lo almaceno en fila \n",
" for i in range(n+1): # calculo cada uno de los coeficientes binomiales y lo almaceno en fila \n",
...
@@ -134,6 +135,7 @@
...
@@ -134,6 +135,7 @@
"outputs": [],
"outputs": [],
"source": [
"source": [
"def pascal2(n):\n",
"def pascal2(n):\n",
" \"\"\"Prints the nth-row of Pascal's triangle.\"\"\"\n",
" if int(n) != n:\n",
" if int(n) != n:\n",
" print('Error: el número ingresado no es entero')\n",
" print('Error: el número ingresado no es entero')\n",
" elif n == 0: # sabemos que la primera fila es un 1\n",
" elif n == 0: # sabemos que la primera fila es un 1\n",
...
@@ -259,6 +261,7 @@
...
@@ -259,6 +261,7 @@
"outputs": [],
"outputs": [],
"source": [
"source": [
"def multipascal(*args):\n",
"def multipascal(*args):\n",
" \"\"\"Returns a list with the arg1, arg2, arg3 th-row of Pascal's triangle.\"\"\"\n",
" nmax = max(*args)\n",
" nmax = max(*args)\n",
" rows = []\n",
" rows = []\n",
" if not all(int(n) == n for n in args): # usando all() para verificar que todos los números sean enteros\n",
" if not all(int(n) == n for n in args): # usando all() para verificar que todos los números sean enteros\n",
...
...
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
# David Ramos - UIS
# David Ramos - UIS
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## Problema: Triángulo de Pascal
## Problema: Triángulo de Pascal
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
**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.**
**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.**
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## Solución 1 (mathy)
## Solución 1 (mathy)
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Los números en la *n-ésima* (empezando en cero) fila del triángulo de Pascal corresponden a los coeficientes binomiales ${n\choose 0},\,{n\choose 1},\,...,\,{n\choose n}$ donde
Los números en la *n-ésima* (empezando en cero) fila del triángulo de Pascal corresponden a los coeficientes binomiales ${n\choose 0},\,{n\choose 1},\,...,\,{n\choose n}$ donde
$$ {n\choose k} = \frac{n!}{k!(n-k)!} .$$
$$ {n\choose k} = \frac{n!}{k!(n-k)!} .$$
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
importnumpyasnp
importnumpyasnp
```
```
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
defpascal1(n):
defpascal1(n):
"""Prints the n-row of Pascal's triangle."""
ifint(n)==n:# reviso que el número sea entero
ifint(n)==n:# reviso que el número sea entero
row=''
row=''
foriinrange(n+1):# calculo cada uno de los coeficientes binomiales y lo almaceno en fila
foriinrange(n+1):# calculo cada uno de los coeficientes binomiales y lo almaceno en fila
La otra opción es construir el triángulo de pascal hasta la *n-ésima* fila e imprimirla.
La otra opción es construir el triángulo de pascal hasta la *n-ésima* fila e imprimirla.
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
defpascal2(n):
defpascal2(n):
"""Prints the nth-row of Pascal's triangle."""
ifint(n)!=n:
ifint(n)!=n:
print('Error: el número ingresado no es entero')
print('Error: el número ingresado no es entero')
elifn==0:# sabemos que la primera fila es un 1
elifn==0:# sabemos que la primera fila es un 1
print('1')
print('1')
else:
else:
prow=(int(1))# guardando la primera fila, se usan tuplas para que sea inmutable
prow=(int(1))# guardando la primera fila, se usan tuplas para que sea inmutable
row=[]# lista donde se crearán las filas
row=[]# lista donde se crearán las filas
foriinrange(1,n+1):# iterando sobre el número de filas
foriinrange(1,n+1):# iterando sobre el número de filas
forkinrange(i+1):# segunda iteración (shame on me) para moverse en "columnas"
forkinrange(i+1):# segunda iteración (shame on me) para moverse en "columnas"
ifk==0ork==i:
ifk==0ork==i:
row.append(int(1))# el primer y el último número es 1
row.append(int(1))# el primer y el último número es 1
else:
else:
row.append(prow[k-1]+prow[k])# elementos interiores como suma de elementos de la fila anterior
row.append(prow[k-1]+prow[k])# elementos interiores como suma de elementos de la fila anterior
prow=tuple(row)# re asigno la fila anterior (como una tupla) para la nueva iteración
prow=tuple(row)# re asigno la fila anterior (como una tupla) para la nueva iteración
frow=row# guardo la fila actual
frow=row# guardo la fila actual
row=[]# vacío la fila para volverla a llenar
row=[]# vacío la fila para volverla a llenar
print(''.join([str(number)+'\t'fornumberinfrow]))# imprimo los número separados por tab
print(''.join([str(number)+'\t'fornumberinfrow]))# imprimo los número separados por tab
```
```
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
pascal2(0)
pascal2(0)
```
```
%% Output
%% Output
1
1
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
pascal2(1)
pascal2(1)
```
```
%% Output
%% Output
1 1
1 1
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
pascal2(2)
pascal2(2)
```
```
%% Output
%% Output
1 2 1
1 2 1
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
pascal2(3)
pascal2(3)
```
```
%% Output
%% Output
1 3 3 1
1 3 3 1
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
pascal2(3.1)
pascal2(3.1)
```
```
%% Output
%% Output
Error: el número ingresado no es entero
Error: el número ingresado no es entero
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
**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.**
**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.**
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Para este caso la estrategia será buscar el número más alto de los brindados por el usuario y la estructura de la rutina es la misma, la única diferencia es que se guardan algunas de las filas intermedias.
Para este caso la estrategia será buscar el número más alto de los brindados por el usuario y la estructura de la rutina es la misma, la única diferencia es que se guardan algunas de las filas intermedias.
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
defmultipascal(*args):
defmultipascal(*args):
"""Returns a list with the arg1, arg2, arg3 th-row of Pascal's triangle."""
nmax=max(*args)
nmax=max(*args)
rows=[]
rows=[]
ifnotall(int(n)==nforninargs):# usando all() para verificar que todos los números sean enteros
ifnotall(int(n)==nforninargs):# usando all() para verificar que todos los números sean enteros
print('Error: uno o más de los números ingresados no es entero')
print('Error: uno o más de los números ingresados no es entero')
elifnmax==0:# sabemos que la primera fila es un 1
elifnmax==0:# sabemos que la primera fila es un 1
rows.append([int(1)])
rows.append([int(1)])
returnrows
returnrows
else:
else:
prow=(int(1))# guardando la primera fila, se usan tuplas para que sea inmutable
prow=(int(1))# guardando la primera fila, se usan tuplas para que sea inmutable
row=[]# lista donde se crearán las filas
row=[]# lista donde se crearán las filas
foriinrange(1,nmax+1):# iterando sobre el número de filas
foriinrange(1,nmax+1):# iterando sobre el número de filas
forkinrange(i+1):# segunda iteración (shame on me) para moverse en "columnas"
forkinrange(i+1):# segunda iteración (shame on me) para moverse en "columnas"
ifk==0ork==i:
ifk==0ork==i:
row.append(int(1))# el primer y el último número es 1
row.append(int(1))# el primer y el último número es 1
else:
else:
row.append(prow[k-1]+prow[k])# elementos interiores como suma de elementos de la fila anterior
row.append(prow[k-1]+prow[k])# elementos interiores como suma de elementos de la fila anterior
prow=tuple(row)# re asigno la fila anterior (como una tupla) para la nueva iteración
prow=tuple(row)# re asigno la fila anterior (como una tupla) para la nueva iteración