Triângulo de Pascal em Python: 3 Métodos Simples (com Código!)

Este guia prático demonstra como gerar o Triângulo de Pascal em Python, utilizando um número específico de linhas.

Inicialmente, você compreenderá a construção do Triângulo de Pascal. Posteriormente, desenvolverá uma função em Python e aprenderá a otimizá-la.

🚀 Vamos começar a explorar!

O que é o Triângulo de Pascal e como ele é formado?

A tarefa de apresentar o Triângulo de Pascal para uma quantidade definida de linhas é um tópico frequente em entrevistas de emprego.

Em um Triângulo de Pascal com ‘n’ linhas, a linha ‘i’ possui ‘i’ elementos.

A primeira linha apresenta um único elemento, que é o número 1. Nas linhas seguintes, cada elemento corresponde à soma dos dois números que se encontram diretamente acima dele.

A ilustração a seguir detalha a construção de um Triângulo de Pascal de cinco linhas.

Triângulo de Pascal com numRows = 5 (Imagem do autor)

Perceba que é possível considerar zeros nas posições acima de um número quando há apenas um valor.

✍️ Como um exercício rápido, tente construir o Triângulo de Pascal para ‘n = 6’ e ‘n = 7’ seguindo o processo descrito acima.

Prosseguindo, vamos iniciar a escrita de código. Sinta-se à vontade para testar os exemplos de código no ambiente Python IDE do etechpt.com, diretamente no seu navegador, enquanto acompanha este tutorial.

Função Python para exibir o Triângulo de Pascal

Nesta etapa, vamos criar uma função em Python com o objetivo de exibir o Triângulo de Pascal para qualquer número de linhas.

É crucial considerar dois aspectos principais:

  • Como representar os valores dentro do Triângulo de Pascal?
  • Como imprimir o Triângulo de Pascal com espaçamento e formatação adequados?

Vamos esclarecer essas questões agora.

#1. Qual a fórmula para cada valor no Triângulo de Pascal?

Descobrimos que os valores no Triângulo de Pascal podem ser derivados usando a fórmula para nCr. Para relembrar os conceitos de matemática, nCr representa o número de combinações possíveis de escolher ‘r’ elementos de um conjunto de ‘n’ elementos.

A fórmula para nCr é apresentada abaixo:

Fórmula nCr (Imagem do autor)

Agora, vamos usar a fórmula nCr para representar os valores no Triângulo de Pascal.

Representação dos valores do Triângulo de Pascal usando nCr (Imagem do autor)

Agora, encontramos uma maneira de representar os valores na matriz.

#2. Como ajustar o espaçamento ao exibir o padrão?

No Triângulo de Pascal com ‘numRows’, a linha #1 tem um elemento, a linha #2 tem dois elementos e assim por diante. Para exibir o padrão em formato de triângulo, será necessário ‘numRows – i’ espaços na linha #i. A função ‘range’ do Python, combinada com um loop ‘for’, pode ser utilizada para isso.

Como a função ‘range’ exclui o ponto final por padrão, adicione + 1 para garantir que o número correto de espaços seja inserido à esquerda.

Agora que você aprendeu a representar os valores e ajustar o espaçamento ao exibir o Triângulo de Pascal, vamos definir a função ‘pascal_tri’.

Analisando a definição da função

Qual o objetivo da função ‘pascal_tri’?

  • A função ‘pascal_tri’ deve receber o número de linhas (‘numRows’) como argumento.
  • Ela deve exibir o Triângulo de Pascal com ‘numRows’.

Para calcular o fatorial, utilizaremos a função ‘factorial’ do módulo ‘math’ integrado do Python.

▶️ Execute o código a seguir para importar ‘factorial’ e utilizá-lo no seu módulo atual.

from math import factorial

O trecho de código abaixo apresenta a definição da função.

def pascal_tri(numRows):
  '''Exibe o Triângulo de Pascal com numRows.'''
  for i in range(numRows):
    # loop para adicionar espaços iniciais
	  for j in range(numRows-i+1):
		  print(end=" ")
    
    # loop para obter os elementos da linha i
	  for j in range(i+1):
		  # nCr = n!/((n-r)!*r!)
		  print(factorial(i)//(factorial(j)*factorial(i-j)), end=" ")

	 # exibe cada linha em uma nova linha
	  print("n")

A função opera da seguinte forma:

  • A função ‘pascal_tri’ tem um parâmetro obrigatório ‘numRows’: o número de linhas.
  • Existem ‘numRows’ linhas no total. Para cada linha ‘i’, adicionamos ‘numRows – i’ espaços antes do primeiro valor na linha.
  • Em seguida, utilizamos a fórmula nCr para calcular cada valor individual. Para a linha ‘i’, os valores são iCj, onde j = {0,1,2,..,i}.
  • Note que usamos ‘//’, que realiza a divisão inteira, pois desejamos que os valores sejam inteiros.
  • Após calcular todos os valores de uma linha, exibimos a próxima linha em uma nova linha.

🔗 Como incluímos uma docstring, você pode utilizar a função de ajuda integrada do Python ou o atributo ‘__doc__’ para acessar a docstring da função. O código abaixo demonstra como fazer isso.

help(pascal_tri)

# Saída
Help on function pascal_tri in module __main__:

pascal_tri(numRows)
    Exibe o Triângulo de Pascal com numRows.

pascal_tri.__doc__

# Saída
Exibe o Triângulo de Pascal com numRows.

Agora, vamos chamar a função com o número de linhas como argumento.

pascal_tri(3)

# Saída
     1
    1 1
   1 2 1

As três primeiras linhas do Triângulo de Pascal são exibidas, como esperado.

Exibindo o Triângulo de Pascal por Recursão

Na seção anterior, identificamos a expressão matemática para cada valor no Triângulo de Pascal. No entanto, não aproveitamos a relação entre os valores em duas linhas consecutivas.

Na realidade, utilizamos a linha anterior para calcular os valores da linha subsequente. Podemos aproveitar essa relação para criar uma implementação recursiva da função ‘pascal_tri’?

Sim, vamos fazer isso!

Em uma implementação recursiva, uma função chama a si mesma repetidamente até que o caso base seja alcançado. Na construção do Triângulo de Pascal, começamos com a primeira linha contendo o valor 1 e, em seguida, construímos as linhas seguintes.

Assim, a chamada da função para ‘pascal_tri(numRows)’ chama, por sua vez, ‘pascal_tri(numRows-1)’ e assim por diante, até que o caso base ‘pascal_tri(1)’ seja atingido.

Considere o exemplo em que precisamos exibir as três primeiras linhas do Triângulo de Pascal. A imagem a seguir ilustra como as chamadas recursivas são armazenadas na pilha e como essas chamadas retornam as linhas do Triângulo de Pascal.

Pilha de chamadas durante as chamadas recursivas (Imagem do autor)

▶️ Execute o código a seguir para gerar as linhas do Triângulo de Pascal recursivamente.

def pascal_tri(numRows):
    '''Exibe o Triângulo de Pascal com numRows.'''
    if numRows == 1:
        return [[1]] # caso base atingido!
    else:
        res_arr = pascal_tri(numRows-1) # chamada recursiva para pascal_tri
        # usa a linha anterior para calcular a linha atual
        cur_row = [1] # toda linha começa com 1
        prev_row = res_arr[-1]
        for i in range(len(prev_row)-1):
            # soma de 2 valores diretamente acima
            cur_row.append(prev_row[i] + prev_row[i+1])
        cur_row += [1] # toda linha termina com 1
        res_arr.append(cur_row)
        return res_arr

Aqui estão alguns pontos que merecem atenção:

  • Utilizamos uma lista aninhada como estrutura de dados, onde cada linha do Triângulo de Pascal é uma lista em si, desta forma: [[linha 1], [linha 2],…,[linha n]].
  • A chamada da função ‘pascal_tri(numRows)’ inicia uma sequência de chamadas recursivas com ‘numRows – 1’, ‘numRows – 2’ até 1 como argumentos. Essas chamadas são armazenadas em uma pilha.
  • Quando ‘numRows == 1’, atingimos o caso base e a função retorna ‘[[1]]’.
  • Em seguida, a lista retornada é utilizada pelas funções subsequentes na pilha de chamadas para calcular a próxima linha.
  • Se ‘cur_row’ for a linha atual, ‘cur_row[i] = linha_anterior[i] + linha_anterior[i+1]’—a soma de dois elementos diretamente acima do índice atual.

Como o array retornado é uma lista aninhada (lista de listas), precisamos ajustar o espaçamento e exibir os valores, conforme demonstrado no código abaixo.

tri_array = pascal_tri(5)

for i,row in enumerate(tri_array):
  for j in range(len(tri_array) - i + 1):
    print(end=" ") # espaços iniciais
  for j in row:
    print(j, end=" ") # exibe os valores
  print("n")  # exibe nova linha

O resultado está correto, como pode ser observado abaixo!

# Saída

       1

      1 1

     1 2 1

    1 3 3 1

   1 4 6 4 1

Função Python para exibir o Triângulo de Pascal para numRows ≤ 5

Ambos os métodos que você aprendeu funcionarão para exibir o Triângulo de Pascal para um número arbitrário de linhas ‘numRows’.

No entanto, em algumas situações, você precisa exibir o Triângulo de Pascal para um número menor de linhas. Quando o número de linhas a serem exibidas for no máximo 5, você pode usar uma técnica simplificada.

Examine a imagem abaixo e observe como as potências de 11 são idênticas aos valores do Triângulo de Pascal. Além disso, observe que isso funciona apenas até a 4ª potência de 11. Ou seja, 11 elevado às potências {0, 1, 2, 3, 4} fornece os valores nas linhas de 1 a 5 do Triângulo de Pascal.

Vamos reescrever a definição da função, como mostrado abaixo:

def pascal_tri(numRows):
  '''Exibe o Triângulo de Pascal com numRows.'''
  for i in range(numRows):
    print(' '*(numRows-i), end='')
    # calcula a potência de 11
    print(' '.join(str(11**i)))

Veja como a função ‘pascal_tri’ opera:

  • Assim como nos exemplos anteriores, ajustamos o espaçamento.
  • Em seguida, usamos o operador de exponenciação do Python (**) para calcular as potências de 11.
  • Como as potências de 11 são números inteiros por padrão, elas são convertidas em uma string usando ‘str()’. Assim, temos as potências de 11 como strings.
  • As strings em Python são iteráveis, permitindo percorrer seus caracteres individualmente.
  • Podemos então utilizar o método ‘join()’ com a sintaxe: ‘<sep>.join(<iterável>)’ para unir os elementos em ‘<iterável>’ usando ‘<sep>’ como separador.
  • Aqui, necessitamos de um único espaço entre os caracteres, então ‘<sep>’ será ‘ ‘, e ‘<iterável>’ será a string: potência de 11.

Vamos verificar se a função opera conforme o esperado.

pascal_tri(5)

# Saída
     1
    1 1
   1 2 1
  1 3 3 1
 1 4 6 4 1

Como outro exemplo, chamemos a função ‘pascal_tri’ com 4 como argumento.

pascal_tri(4)

# Saída
     1
    1 1
   1 2 1
  1 3 3 1

Espero que agora você entenda como exibir o Triângulo de Pascal facilmente para ‘numRows’ no intervalo de 1 a 5.

Conclusão

Aqui está o que aprendemos:

  • Como construir o Triângulo de Pascal para um número específico de linhas. Cada número em uma linha é a soma dos dois números diretamente acima dele.
  • Criar uma função em Python utilizando a fórmula nCr = n!/(n-r)!.r! para calcular os valores do Triângulo de Pascal.
  • Você também aprendeu uma implementação recursiva da função.
  • Por fim, você descobriu o método ideal para construir o Triângulo de Pascal para ‘numRows’ até 5 — utilizando as potências de 11.

Caso queira aprimorar suas habilidades em Python, aprenda a multiplicar matrizes, verificar se um número é primo e resolver problemas em operações com strings. Bons estudos!