Cómo imprimir el triángulo de Pascal en Python

Este tutorial le enseñará cómo imprimir el triángulo de Pascal en Python para un número determinado de filas.

Comenzará aprendiendo cómo construir el triángulo de Pascal. Luego procederá a escribir una función de Python y aprenderá a optimizarla aún más.

▶️ ¡Comenzamos!

¿Qué es el Triángulo de Pascal y cómo construirlo?

Imprimir el triángulo de Pascal para un número dado de filas es una pregunta popular en las entrevistas.

En el triángulo de Pascal con n filas, la fila número i tiene i elementos.

Entonces, la primera fila tiene un elemento, y es 1. Y cada elemento en las filas subsiguientes es la suma de los dos números directamente arriba.

La siguiente figura explica cómo construir el triángulo de Pascal con cinco filas.

Triángulo de Pascal para numRows = 5 (Imagen del autor)

Observe cómo puede rellenar ceros cuando solo tiene un número por encima de cierto número.

📝Como ejercicio rápido, sigue el procedimiento anterior para construir el triángulo de Pascal para n = 6 y n = 7.

A continuación, procedamos a escribir algo de código. Puede optar por ejecutar los fragmentos de código en el IDE de Python de kirukiru.es directamente desde su navegador, a medida que avanza en el tutorial.

Función de Python para imprimir el triángulo de Pascal

En esta sección, escribamos una función de Python para imprimir el triángulo de Pascal para cualquier número de filas.

Hay dos preguntas clave a considerar:

  • ¿Cómo expresar las entradas en el triángulo de Pascal?
  • ¿Cómo imprimir el triángulo de Pascal con el espaciado y el formato adecuados?

Vamos a responderlas ahora.

#1. ¿Cuál es la expresión para cada entrada en el triángulo de Pascal?

Sucede que las entradas en el triángulo de Pascal se pueden obtener usando la fórmula para nCr. Si recuerda las matemáticas de su escuela, nCr denota la cantidad de formas en que puede elegir r elementos de un conjunto de n elementos.

La fórmula para nCr se da a continuación:

Fórmula nCr (Imagen del autor)

Ahora procedamos a expresar las entradas en el triángulo de Pascal usando la fórmula nCr.

Entradas del triángulo de Pascal usando nCr (Imagen del autor)

Ahora hemos encontrado una manera de expresar las entradas en la matriz.

#2. ¿Cómo ajustar el espaciado al imprimir el patrón?

En el triángulo de Pascal con numRows, la fila #1 tiene una entrada, la fila #2 tiene dos entradas, y así sucesivamente. Para imprimir el patrón como un triángulo, necesitará numRows – i espacios en la fila #i. Y puede usar la función de rango de Python junto con for loop para hacer esto.

Como la función de rango excluye el punto final de forma predeterminada, asegúrese de agregar + 1 para obtener el número requerido de espacios iniciales.

Ahora que ha aprendido a representar entradas y también a ajustar el espacio mientras imprime el triángulo de Pascal, avancemos y definamos la función pascal_tri.

Análisis de la definición de la función

Entonces, ¿qué quieres que haga la función pascal_tri?

  • La función pascal_tri debería aceptar el número de filas (numRows) como argumento.
  • Debería imprimir el triángulo de Pascal con numRows.

Para calcular el factorial, usemos la función factorial del módulo matemático integrado de Python.

▶️ Ejecute la siguiente celda de código para importar factorial y utilícelo en su módulo actual.

from math import factorial

El fragmento de código siguiente contiene la definición de la función.

def pascal_tri(numRows):
  '''Print Pascal's triangle with numRows.'''
  for i in range(numRows):
    # loop to get leading spaces
	  for j in range(numRows-i+1):
		  print(end=" ")
    
    # loop to get elements of row i
	  for j in range(i+1):
		  # nCr = n!/((n-r)!*r!)
		  print(factorial(i)//(factorial(j)*factorial(i-j)), end=" ")

	 # print each row in a new line
	  print("n")

La función funciona de la siguiente manera:

  • La función pascal_tri tiene un parámetro obligatorio numRows: el número de filas.
  • Hay numRows filas en total. Para cada fila i, agregamos numRows – i espacios iniciales antes de la primera entrada en la fila.
  • Luego usamos la fórmula nCr para calcular las entradas individuales. Para la fila i, las entradas son iCj donde j = {0,1,2,..,i}.
  • Observe que usamos // que realiza la división de enteros, ya que nos gustaría que las entradas fueran números enteros.
  • Después de calcular todas las entradas en una fila, imprima la siguiente fila en una nueva línea.

🔗 Como hemos añadido un cadena de documentación, puede utilizar la función de ayuda integrada de Python o el atributo __doc__ para acceder a la cadena de documentación de la función. El fragmento de código a continuación muestra cómo hacerlo.

help(pascal_tri)

# Output
Help on function pascal_tri in module __main__:

pascal_tri(numRows)
    Print Pascal's triangle with numRows.

pascal_tri.__doc__

# Output
Print Pascal's triangle with numRows.

Ahora sigamos adelante y llamemos a la función con el número de filas como argumento.

pascal_tri(3)

# Output
     1
    1 1
   1 2 1

Las primeras 3 filas del triángulo de Pascal se imprimen, como se esperaba.

Imprimir el triángulo de Pascal usando recursividad

En la sección anterior, identificamos la expresión matemática de cada entrada en el Triángulo de Pascal. Sin embargo, no utilizamos la relación entre entradas en dos filas consecutivas.

De hecho, usamos la fila anterior para calcular las entradas en la fila siguiente. ¿No podemos usar esto y crear una implementación recursiva de la función pascal_tri?

¡Si hagamos eso!

En una implementación recursiva, una función se llama a sí misma repetidamente hasta que se cumple el caso base. En la construcción del triángulo de Pascal, comenzamos con la primera fila con una entrada 1 y luego construimos las filas subsiguientes.

Entonces, la llamada de función a pascal_tri(numRows) a su vez llama a pascal_tri(numRows-1) y así sucesivamente, hasta que se alcanza el caso base pascal_tri(1).

Considere el ejemplo donde necesita imprimir las primeras 3 filas del triángulo de Pascal. La siguiente imagen explica cómo se empujan las llamadas recursivas a la pila. Y cómo las llamadas de funciones recursivas devuelven las filas del triángulo de Pascal.

Pila de llamadas durante llamadas recursivas (Imagen del autor)

▶️ Ejecute el fragmento de código a continuación para generar las filas del triángulo de Pascal de forma recursiva.

def pascal_tri(numRows):
    '''Print Pascal's triangle with numRows.'''
    if numRows == 1:
        return [[1]] # base case is reached!
    else:
        res_arr = pascal_tri(numRows-1) # recursive call to pascal_tri
        # use previous row to calculate current row 
        cur_row = [1] # every row starts with 1
        prev_row = res_arr[-1] 
        for i in range(len(prev_row)-1):
            # sum of 2 entries directly above
            cur_row.append(prev_row[i] + prev_row[i+1]) 
        cur_row += [1] # every row ends with 1
        res_arr.append(cur_row)
        return res_arr

Aquí hay algunos puntos que vale la pena tomar nota:

  • Hemos usado una lista anidada como estructura de datos, donde cada fila en el triángulo de Pascal es una lista en sí misma, como esta: [[row 1], [row 2],…,[row n]].
  • La llamada a la función pascal_tri(numRows) desencadena una serie de llamadas recursivas con numRows – 1, numRows – 2 hasta 1 como argumentos. Estas llamadas se colocan en una pila.
  • Cuando numRows == 1, hemos llegado al caso base y la función devuelve [[1]].
  • Ahora la lista devuelta es utilizada por las funciones subsiguientes en la pila de llamadas para calcular la siguiente fila.
  • Si cur_row es la fila actual, cur_row[i] = fila_anterior[i] + fila_anterior[i+1]—la suma de 2 elementos directamente sobre el índice actual.

Como la matriz devuelta es una lista anidada (lista de listas), debemos ajustar el espaciado e imprimir las entradas, como se muestra en la celda de código a continuación.

tri_array = pascal_tri(5)

for i,row in enumerate(tri_array):
  for j in range(len(tri_array) - i + 1):
    print(end=" ") # leading spaces
  for j in row:
    print(j, end=" ") # print entries
  print("n")  # print new line

¡La salida es correcta, como se ve a continuación!

# Output

       1

      1 1

     1 2 1

    1 3 3 1

   1 4 6 4 1

Función de Python para imprimir el triángulo de Pascal para numRows ≤ 5

Ambos métodos que ha aprendido funcionarán para imprimir el triángulo de Pascal para un número arbitrario de filas numRows.

Sin embargo, hay momentos en los que necesita imprimir el triángulo de Pascal para un número menor de filas. Y cuando el número de filas que necesita imprimir es como máximo 5, puede usar una técnica sencilla.

Ir a través de la figura de abajo. Y observa cómo las potencias de 11 son idénticas a las entradas en el triángulo de Pascal. Además, observe que esto funciona solo hasta la cuarta potencia de 11. Es decir, 11 elevado a las potencias {0, 1, 2, 3, 4} da las entradas en las filas 1 a 5 del triángulo de Pascal.

Reescribamos la definición de la función, como se muestra a continuación:

def pascal_tri(numRows):
  '''Print Pascal's triangle with numRows.'''
  for i in range(numRows):
    print(' '*(numRows-i), end='')
    # compute power of 11
    print(' '.join(str(11**i)))

Así es como funciona la función pascal_tri:

  • Al igual que con los ejemplos anteriores, ajustamos el espaciado.
  • Y luego, usamos el operador de exponenciación de Python (**) para calcular las potencias de 11.
  • Como las potencias de 11 son números enteros por defecto, conviértalos en una cadena usando str(). Ahora tienes las potencias de 11 como cadenas.
  • Las cadenas en Python son iterables, por lo que puede recorrerlas y acceder a un carácter a la vez.
  • A continuación, puede usar el método join() con la sintaxis: .join() para unir elementos en usando como separador.
  • Aquí, necesita un solo espacio entre los caracteres, por lo que será ‘ ‘, es cadena: potencia de 11.

Verifiquemos si la función funciona según lo previsto.

pascal_tri(5)

# Output
     1
    1 1
   1 2 1
  1 3 3 1
 1 4 6 4 1

Como otro ejemplo, llame a la función pascal_tri con 4 como argumento.

pascal_tri(4)

# Output
     1
    1 1
   1 2 1
  1 3 3 1

Espero que sepa comprender cómo puede imprimir fácilmente el triángulo de Pascal para numRows en el rango de 1 a 5.

Conclusión

Esto es lo que hemos aprendido:

  • Cómo construir el triángulo de Pascal con el número dado de filas. Cada número en cada fila es la suma de los dos números directamente arriba.
  • Escriba una función de Python usando la fórmula nCr = n!/(nr)!.r! para calcular las entradas del triángulo de Pascal.
  • Luego aprendió una implementación recursiva de la función.
  • Finalmente, aprendiste el método más óptimo para construir el triángulo de Pascal para filas numéricas hasta 5, usando las potencias de 11.

Si está buscando mejorar sus habilidades en Python, aprenda a multiplicar matrices, verifique si un número es primo y resuelva problemas en operaciones de cadenas. ¡Feliz codificación!