diff --git a/Ejercicio2.ipynb b/Ejercicio2.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..67eb98d2cdb0f4e8905546916519875e671dcddd --- /dev/null +++ b/Ejercicio2.ipynb @@ -0,0 +1,245 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Ejercicio No. 2 - Triángulo de Pascal\n", + "**Enunciado:**\n", + "\n", + "- Escriba una rutina en python que reciba como entrada un número entero, $n$, e imprima los\n", + "números en la $n$-ésima fila del triángulo de Pascal. El programa debe verificar si el número\n", + "$n$ es entero, o arrojar un mensaje informando que ha habido un error del usuario en caso\n", + "contrario.\n", + "- Modifique la rutina anterior para que reciba un número variable de argumentos: $n_1$, $n_2$, $n_3$,...\n", + "y retorne una lista cuyo primer elemento es una lista conteniendo los números en la fila $n_1$\n", + "del triángulo de Pascal, el segundo elemento una lista con los números en la fila $n_2$, y asÃ\n", + "sucesivamente.\n", + "\n", + "**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", + "metadata": {}, + "source": [ + "## Primera parte\n", + "\n", + "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", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import math" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def combinatory(n:int, k:int)->int:\n", + " \"\"\"\n", + " Esta fucnión calcula la combinatoria entre dos enteros dados.\n", + " \n", + " Input\n", + " ------\n", + " n (int): entero positivo mayor que k.\n", + " k (int): entero positivo menor que n.\n", + " \n", + " Output\n", + " ------\n", + " comb (int): entero resultante de hacer la combinación entre n y k.\n", + " \"\"\"\n", + " if k>n or n<0 or k<0: # Condición matemática para que la operación factorial esté bien definida.\n", + " \n", + " return \"Recuerde que el segundo argumento ha de ser mayor que el primero y ambos positivos.\"\n", + " \n", + " else:\n", + " f = math.factorial\n", + " comb = int(f(n)/(f(k)*f(n-k))) # Definición de combinatoria\n", + "\n", + " return comb " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def pascalTriangle(n:int)->list:\n", + " \"\"\"\n", + " Esta función recibe un número natural n y retorna los elementos de la n-ésima fila del triángulo de Pascal.\n", + " La notación es tal que las primeras posiciones comienzan en cero.\n", + " \n", + " Input\n", + " ------\n", + " n (int): número que se espera que sea entero.\n", + " \n", + " Output\n", + " ------\n", + " triangleRow (list): lista de números que corresponden a la n-ésima fila del triángulo de Pascal.\n", + " \"\"\"\n", + " if type(n)!= int or n<0:\n", + " return \"The number you gave is either non integer or is less than zero.\"\n", + " else: \n", + " triangleRow = []\n", + " for k in range(n+1):\n", + " triangleRow.append(combinatory(n,k))\n", + " return triangleRow" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ahora podemos probar la función principal para los casos triviales y algunos más complicados." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1]\n", + "[1, 1]\n", + "[1, 2, 1]\n", + "[1, 3, 3, 1]\n", + "[1, 4, 6, 4, 1]\n", + "[1, 5, 10, 10, 5, 1]\n", + "[1, 6, 15, 20, 15, 6, 1]\n" + ] + } + ], + "source": [ + "print(pascalTriangle(0))\n", + "print(pascalTriangle(1))\n", + "print(pascalTriangle(2))\n", + "print(pascalTriangle(3))\n", + "print(pascalTriangle(4))\n", + "print(pascalTriangle(5))\n", + "print(pascalTriangle(6))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Segunda parte\n", + "\n", + "Continuando con la segunda parte del ejercicio, se procede a extender la función `pascalTriangle` a múltiples argumentos." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def pascalTriangleExtended(*args)->list:\n", + " \"\"\"\n", + " Esta función recibe un número no definido de argumentos que se espera que correspondan a números naturales.\n", + " \n", + " Input\n", + " ------\n", + " *args: lista de argumentos con longitud no definida los cuales se espera que correspondan a números naturales.\n", + " \n", + " Output\n", + " ------\n", + " allRows (list): lista que contiene listas, las cuales corresponden a las filas del triángulo de Pascal asociadas\n", + " a los argumentos dados n1, n2, n3, etc.\n", + " \"\"\"\n", + " allRows = []\n", + " for jj in args:\n", + " if type(jj)!=int or jj<0:\n", + " return \"At least one of the numbers you gave is either non integer or is less than zero.\"\n", + " break\n", + " else:\n", + " triangleRow = []\n", + " for k in range(jj+1):\n", + " triangleRow.append(combinatory(jj,k))\n", + " allRows.append(triangleRow)\n", + " \n", + " return allRows" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[1],\n", + " [1, 1],\n", + " [1, 2, 1],\n", + " [1, 3, 3, 1],\n", + " [1, 4, 6, 4, 1],\n", + " [1, 5, 10, 10, 5, 1],\n", + " [1, 6, 15, 20, 15, 6, 1]]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pascalTriangleExtended(0,1,2,3,4,5,6)" + ] + } + ], + "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 +}