Con un clima tan bueno, no tienes muchas ganas de pasar una hora en un salón de clases. Con fastidio, entras al salón de clases, donde notas en el pizarrón una forma triangular extrañamente satisfactoria. Mientras esperas a que llegue tu profesor de matemáticas, no puedes evitar notar algunos patrones en el triángulo: los valores de los extremos son todos unos, cada fila tiene un valor más que la anterior y el triángulo es simétrico. ¡Qué raro!
Poco después de que te sientas, tu profesor entra al salón y te explica que este triángulo es el famoso triángulo de Pascal.
Durante la siguiente hora, tu profesor revela algunas cosas asombrosas que se esconden en este triángulo:
El profesor les suplica a tus compañeros y a ti que busquen otros usos, y te asegura que hay muchísimos más. En ese momento, suena el timbre de la escuela. Te das cuenta de que durante la última hora te habías sumergido por completo en aprender sobre el triángulo de Pascal. Rápidamente tomas tu laptop de la mochila y sales al exterior, listo para disfrutar del sol y de las maravillas del triángulo de Pascal.
Tu tarea es generar las primeras N filas del triángulo de Pascal.
El triángulo de Pascal es un array triangular de números enteros positivos.
En el triángulo de Pascal, la cantidad de valores de una fila es igual al número de esa fila (que empieza en uno). Por lo tanto, la primera fila tiene un valor, la segunda fila tiene dos valores, y así sucesivamente.
La primera fila (la de más arriba) tiene un solo valor: 1.
Los valores de las filas siguientes se calculan sumando los números que están inmediatamente a la derecha y a la izquierda de la posición actual en la fila anterior.
Si la fila anterior no tiene un valor a la izquierda o a la derecha de la posición actual (lo que solo ocurre en las posiciones de los extremos izquierdo y derecho), toma el valor de esa posición como cero (en la práctica, lo «ignoras» al hacer la suma).
Veamos las primeras 5 filas del triángulo de Pascal:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
La fila de más arriba tiene un solo valor, que es 1.
Los valores de los extremos, el izquierdo y el derecho, solo tienen una posición anterior que considerar: la que está a su derecha y la que está a su izquierda, respectivamente.
Como el valor de más arriba es 1, se deduce que todos los valores de los extremos también son 1.
Los demás valores tienen dos posiciones que considerar.
Por ejemplo, el valor del medio de la quinta fila (1 4 6 4 1) es 6, ya que los valores a su izquierda y a su derecha en la fila anterior son 3 y 3:
Este ejercicio está diseñado para completarse usando recursion, en lugar de bucles. Una función recursiva es una función que se llama a sí misma, algo útil cuando resuelves problemas que se definen en términos de sí mismos. Para evitar la recursión infinita (o, más concretamente, para evitar desbordar la pila), se usa algo llamado «caso base». Cuando se alcanza el caso base, se devuelve un valor no recursivo, lo que permite que la llamada anterior a la función se resuelva y devuelva su valor, y así sucesivamente, propagándose hacia atrás por la pila hasta que la primera llamada a la función devuelve la respuesta. Podríamos escribir una función recursiva para encontrar la respuesta de 5! (es decir, 5 * 4 * 3 * 2 * 1) así:
def factorial(number):
if number <= 1: # base case
return 1
return number * factorial(number - 1) # recursive case
print(factorial(5)) # returns 120
Por último, cabe señalar que Python limita el número de veces que se pueden hacer llamadas recursivas (1000 de forma predeterminada) y no optimiza la recursión de cola.
A veces es necesario lanzar una excepción. Cuando lo hagas, siempre debes incluir un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho a la hora de depurar. En situaciones en las que sabes que el origen del error será de un tipo determinado, puedes optar por lanzar uno de los tipos de error incorporados, pero aun así debes incluir un mensaje significativo.
Este ejercicio en particular requiere que uses la sentencia raise para «lanzar» varios ValueErrors si se le pasa un número negativo a la función rows().
Las pruebas solo pasarán si lanzas la exception y además incluyes un mensaje con ella.
Para lanzar un ValueError con un mensaje, escribe el mensaje como argumento del tipo exception:
# if the rows function is passed a negative number.
raise ValueError("number of rows is negative")
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.