Geekflare cuenta con el apoyo de nuestra audiencia. Podemos ganar comisiones de afiliados comprando enlaces en este sitio.
Comparte en:

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

triangulo de pascal en python
Escáner de seguridad de aplicaciones web Invicti – la única solución que ofrece verificación automática de vulnerabilidades con Proof-Based Scanning™.

Este tutorial le enseñará cómo Imprimir 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!

What is Pascal’s Triangle & How to Construct it?

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, número de fila i tiene i elementos.

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

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

pascal-triangulo-python
Triángulo de Pascal para numRows = 5 (Imagen del autor)

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

📝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 IDE Python de Geekflare directamente desde su navegador, mientras avanza en el tutorial.

Python Function to Print Pascal’s Triangle

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 recuerdas de las matemáticas de tu escuela, nCr indica el número de formas que puede elegir r elementos de un conjunto de n los productos.

La formula para nCr se da a continuación:

fórmula ncr
Fórmula nCr (Imagen del autor)

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

pascal-triangulo-ncr-formula
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ás numRows - i espacios en la fila #i. Y puedes usar Python range función en conjunto con for bucle para hacer esto.

A este tenor, range 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 sea la función? pascal_tri que hacer?

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

Para calcular el factorial, usemos factorial función de la función incorporada de Python math módulo.

▶️ 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 requerido numRows: el número de filas.
  • Existen numRows filas en total. por cada fila i, añadimos numRows - i espacios iniciales antes de la primera entrada en la fila.
  • Luego usamos nCr fórmula para calcular las entradas individuales. por fila i, las entradas son iCj donde j = {0,1,2,..,i}.
  • Observa 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 usar el integrado de Python help función, o la __doc__ atributo 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.

Print Pascal’s Triangle Using Recursion

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 llegar a un recursiva implementación de la función pascal_tri?

¡Si hagamos eso!

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

Entonces la función llama a pascal_tri(numRows) a su vez llama pascal_tri(numRows-1) y así sucesivamente, hasta el caso base pascal_tri(1) sea alcanzado.

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.

pascal-triangulo-recursion
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: [[fila 1], [fila 2],…,[fila n]].
  • La llamada a la función pascal_tri(numRows) desencadena una serie de llamadas recursivas con numRows - 1, numRows - 2 todo el camino hasta 1 como argumentos. Estas llamadas se colocan en una pila.
  • Cuándo numRows == 1, llegamos 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.
  • If cur_row es la fila actual, cur_row[i] = prev_row[i] + prev_row[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

Python Function to Print Pascal’s Triangle for 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 4. Es decir, 11 elevado a las potencias {11, 0, 1, 2, 3} da las entradas en las filas 4 a 1 del triángulo de Pascal.

pascal-triangulo-potencias-de-11

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 obras:

  • 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 utilizar el join() método con la sintaxis: <sep>.join(<iterable>) unir elementos en <iterable> usar <sep> como separador.
  • Aquí, necesitas un soltero espacio entre los caracteres, por lo que <sep> se mostrarán ' ', <iterable> 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 entender 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 aprendiste un implementación recursiva de la función.
  • Finalmente, aprendiste el método más óptimo para construir el triángulo de Pascal para numRows hasta 5—usando el potencias de 11.

Si está buscando mejorar sus habilidades de Python, aprenda a multiplicar matrices, compruebe si un numero es primoy resolver problemas en operaciones con cadenas. ¡Feliz codificación!

Gracias a nuestros patrocinadores
Más lecturas interesantes sobre el desarrollo
Impulse su negocio
Algunas de las herramientas y servicios para ayudar a que su negocio crezca.
  • Invicti utiliza Proof-Based Scanning™ para verificar automáticamente las vulnerabilidades identificadas y generar resultados procesables en cuestión de horas.
    Prueba Invicti
  • Web scraping, proxy residencial, administrador de proxy, desbloqueador web, rastreador de motores de búsqueda y todo lo que necesita para recopilar datos web.
    Prueba Brightdata
  • Semrush es una solución de marketing digital todo en uno con más de 50 herramientas en SEO, redes sociales y marketing de contenido.
    Prueba Semrush
  • Intruder es un escáner de vulnerabilidades en línea que encuentra debilidades de ciberseguridad en su infraestructura, para evitar costosas filtraciones de datos.
    Intente Intruder