diff --git a/ejercicio2_SemprumG.ipynb b/ejercicio2_SemprumG.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..446e817e0571cf168f83f854ab0ac33ee03ed688 --- /dev/null +++ b/ejercicio2_SemprumG.ipynb @@ -0,0 +1,274 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ejercicio 2. Triángulo de Pascal.\n", + "#### Gerardo Semprúm.\n", + "#### Usuario de Mattermost: @semprumg\n", + "#### Universidad Central de Venezuela." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Escriba una rutina en python que reciba como entrada un numero entero, n, e imprima los numeros en la n-esima fila del triangulo 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.**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Anexamos una primera solución que utilizará ciclos for, condicionales if y uso de listas para la resolución del problema.\n", + "Comenzando con probar si un número es entero o nó, ya que, el programa descrito necesita un número \"n\" que sea entero." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Para lo antes descrito utilizamos un try/except, una herramienta de python que permite que el programa intente una secuencia de codigo y si falla obtenga otro camino o salida." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Por favor ingresa tu número entero: 4\n" + ] + } + ], + "source": [ + "n = input(\"Por favor ingresa tu número entero: \") #Entrada de un numero entero\n", + "try:\n", + " n = int(n) #El programa tratará de probar si el numero es entero\n", + "except:\n", + " print(\"Error de usuario: entrada no valida/número decimal\")\n", + " #Si la condición no se cumple, se imprimirá el mensaje de arriba " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Creamos una lista vacia llamada \"pascal\", en donde mediante el ciclo for podremos ir agregando los diferentes elementos en el rango de el \"n\" que introducimos en el paso anterior.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 3, 3, 1]\n" + ] + } + ], + "source": [ + "pascal = [] #Nuestra lista vacia de pascal \n", + "for i in range(n): #abrimos un ciclo que cuente sobre el rango de \"n\"\n", + " pascal.append([]) #Agregamos un elemento vacio a la lista de pascal\n", + " pascal[i].append(1) #Por cada elemneto \"i\" se agregará un \"1\" a la lista\n", + " \n", + " #Creamos un segundo ciclo for, de donde, se tomaran elementos j desde \"1\" hasta \"i\"\n", + " for j in range (1,i): \n", + " pascal[i].append(pascal[i-1][j-1]+pascal[i-1][j])\n", + " #Para cada elemento i en pascal se agregará otro elemento el cual resulta entre \n", + " #diferentes operaciones entre \"j\" e \"i\"\n", + " if (n!=0): #Si n es diferente a 0 agregaremos un 1 a la lista pascal\n", + " pascal[i].append(1)\n", + "print(pascal[-1])\n", + "#Pedimos imprimir el ultimo termino de la lista con pascal[-1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Forma alternativa de resolver el ejercicio**\n", + "\n", + "El triangulo de pascal es el resultado de hacer multiples combinatorias, por lo tanto:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Importamos la libreria math, de donde pedimos por un elemento m y j para realizar combinaciones de la forma:\n", + "$$C_(m,j) = \\frac{m!}{j!(m-j)!}$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import math #Llamamos a la libreria math\n", + "def comb(m,j): #Definimos nuestra funcion combinatoria\n", + " val = int((math.factorial(m))/(math.factorial(m-j)*math.factorial(j)))\n", + " #val sera la ecuación que contiene todas las operaciones factoriales \n", + " return val\n", + "#Pedimos que el programa retorne val para cerrar el ciclo de la función" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Por favor ingresa tu número entero: 3\n", + "[1, 3, 3, 1]\n" + ] + } + ], + "source": [ + "m = input(\"Por favor ingresa tu número entero: \") #Entrada de un numero entero\n", + "try:\n", + " m = int(m) #El programa tratará de probar si el numero es entero\n", + "except:\n", + " print(\"Error de usuario: entrada no valida/número decimal\")\n", + " #Si la condición no se cumple, se imprimirá el mensaje de arriba \n", + "\n", + "pascal = []\n", + "for i in range(0,m+1):\n", + " pascal.append(comb(m,i))\n", + " \n", + "print(pascal) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Nota importante:**\n", + "El primer codigo esta desfasado del segundo codigo en una unidad." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Modificar la rutina anterior para que rebiba un número variable de argumentos:n1,n2,n3 y retorne\n", + "una lista cuyo primer elemento es una lista conteniendo los numeros en la final n1 del triangulo\n", + "de Pascal, el segundo elemento una lista con los numeros en la fila n2 y asà sucesivamente.**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Para hacer un codigo más simple, usaremos nuestra función combinatoria, la re-definimos con respecto a \"p\" para que no haya problemas con la función combinatoria definida antes en el apartado anterior.\n", + "\n", + "La función combinatoria fue explicada en el apartado anterior" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "def comb1(p,j):\n", + " val = int((math.factorial(p))/(math.factorial(p-j)*math.factorial(j)))\n", + " return val" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Definimos ahora una nueva función que sea una fila de pascal que pueda ser llamada con varios valores que, en este caso, llamamos p. No sabemos cuantos argumentos de entrada usaremos asi que usamos (*args) para darle a entender a la función que son argumentos separados por una coma.\n", + "\n", + "Dentro de la nueva función de pascal, llamamos a nuestra función combinatoria y obtenemos el resultado deseado" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def pascal_vars(*args): #Definimos nuestra función pascal_vars (pascal-variables)\n", + " for p in args: #Ciclo for que incluya todos los valores p contenidos en (*args)\n", + " try:\n", + " p = int(p) #El programa tratará de probar si el numero es entero\n", + " except:\n", + " print(\"Error de usuario: entrada no valida/número decimal\")\n", + " #Si la condición no se cumple, se imprimirá el mensaje de arriba \n", + " \n", + " pascal = [] #Creamos nuestra lista vacia pascal\n", + " for i in range(0,p+1): #Para cada elemento que vaya de 0 a p+1\n", + " pascal.append(comb1(p,i)) #agregamos dichos elementos a nuestra lista pascal con nuestra \n", + " #función combinatoria\n", + " \n", + " print(\"La fila de pascal correspondiente a\",p,\"es:\",pascal) \n", + " #Imprimimos un mensaje para el usuario que denota que numero se está usando y que fila del \n", + " #triangulo se obtiene." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finalmente, llamamos a nuestra función con los argumentos deseados " + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "La fila de pascal correspondiente a 4 es: [1, 4, 6, 4, 1]\n", + "La fila de pascal correspondiente a 5 es: [1, 5, 10, 10, 5, 1]\n", + "La fila de pascal correspondiente a 8 es: [1, 8, 28, 56, 70, 56, 28, 8, 1]\n", + "La fila de pascal correspondiente a 9 es: [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]\n" + ] + } + ], + "source": [ + "pascal_vars(4,5,8,9)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}