Hoe de driehoek van Pascal in Python af te drukken?

Deze tutorial leert je hoe je de driehoek van Pascal in Python kunt afdrukken voor een bepaald aantal rijen.

Je begint met het leren bouwen van de driehoek van Pascal. Je gaat dan verder met het schrijven van een Python-functie en leert deze verder te optimaliseren.

▶️ Laten we beginnen!

Wat is de driehoek van Pascal en hoe deze te construeren?

Het afdrukken van de driehoek van Pascal voor een bepaald aantal rijen is een populaire vraag in een sollicitatiegesprek.

In de driehoek van Pascal met n rijen, heeft rijnummer i i-elementen.

Dus de eerste rij heeft één element, en het is 1. En elk element in de volgende rijen is de som van de twee getallen er direct boven.

In de volgende afbeelding wordt uitgelegd hoe u de driehoek van Pascal met vijf rijen construeert.

Pascal’s driehoek voor numRows = 5 (Afbeelding door de auteur)

Merk op hoe u nullen kunt invullen als u slechts één cijfer boven een bepaald cijfer heeft.

📝Als een snelle oefening volgt u de bovenstaande procedure om de driehoek van Pascal te construeren voor n = 6 en n = 7.

Laten we vervolgens verder gaan met het schrijven van wat code. U kunt ervoor kiezen om de codefragmenten op de Python IDE van epcdream.nl rechtstreeks vanuit uw browser uit te voeren, terwijl u zich een weg baant door de zelfstudie.

Python-functie om de driehoek van Pascal af te drukken

Laten we in deze sectie een Python-functie schrijven om de driehoek van Pascal af te drukken voor een bepaald aantal rijen.

Er zijn twee belangrijke vragen om te overwegen:

  • Hoe de vermeldingen in de driehoek van Pascal uit te drukken?
  • Hoe de driehoek van Pascal afdrukken met de juiste spatiëring en opmaak?

Laten we ze nu beantwoorden.

#1. Wat is de uitdrukking voor elk item in de driehoek van Pascal?

Het is zo dat de vermeldingen in de driehoek van Pascal kunnen worden verkregen met behulp van de formule voor nCr. Als je je de wiskunde van je school herinnert, geeft nCr het aantal manieren aan waarop je r items kunt kiezen uit een set van n items.

De formule voor nCr wordt hieronder gegeven:

nCr-formule (Afbeelding door de auteur)

Laten we nu verder gaan met het uitdrukken van de items in de driehoek van Pascal met behulp van de nCr-formule.

Pascal’s driehoeksvermeldingen met nCr (Afbeelding door de auteur)

We hebben nu een manier gevonden om de items in de matrix uit te drukken.

  Wat is een Smarthome?

#2. Hoe de afstand aanpassen bij het afdrukken van het patroon?

In de driehoek van Pascal met numRows heeft rij #1 één invoer, rij #2 heeft twee invoer, enzovoort. Om het patroon als een driehoek af te drukken, hebt u numRows – i spaties in rij #i nodig. En je kunt de bereikfunctie van Python gebruiken in combinatie met de for-lus om dit te doen.

Aangezien de bereikfunctie standaard het eindpunt uitsluit, moet u + 1 toevoegen om het vereiste aantal voorloopspaties te krijgen.

Nu je hebt geleerd hoe je items representeert en ook om de ruimte aan te passen tijdens het afdrukken van de driehoek van Pascal, gaan we verder en definiëren we de functie pascal_tri.

De functiedefinitie ontleden

Dus wat wil je dat de functie pascal_tri doet?

  • De functie pascal_tri zou het aantal rijen (numRows) als argument moeten accepteren.
  • Het zou de driehoek van Pascal moeten afdrukken met numRows.

Om de faculteit te berekenen, gebruiken we de faculteitsfunctie van de ingebouwde wiskundemodule van Python.

▶️ Voer de volgende codecel uit om faculteit te importeren en gebruik deze in uw huidige module.

from math import factorial

Het onderstaande codefragment bevat de functiedefinitie.

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")

De functie werkt als volgt:

  • De functie pascal_tri heeft één vereiste parameter numRows: het aantal rijen.
  • Er zijn in totaal een aantal rijen. Voor elke rij i voegen we numRows toe – i voorloopspaties vóór het eerste item in de rij.
  • Vervolgens gebruiken we de nCr-formule om de afzonderlijke vermeldingen te berekenen. Voor rij i zijn de invoeren iCj waarbij j = {0,1,2,..,i}.
  • Merk op dat we // gebruiken die deling van gehele getallen uitvoert, omdat we willen dat de items gehele getallen zijn.
  • Nadat u alle vermeldingen op een rij hebt berekend, drukt u de volgende rij op een nieuwe regel af.

🔗 Zoals we hebben toegevoegd docstring, kunt u de ingebouwde helpfunctie van Python of het kenmerk __doc__ gebruiken om toegang te krijgen tot de docstring van de functie. Het onderstaande codefragment laat zien hoe u dit moet doen.

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.

Laten we nu doorgaan en de functie aanroepen met het aantal rijen als argument.

pascal_tri(3)

# Output
     1
    1 1
   1 2 1

De eerste 3 rijen van de driehoek van Pascal zijn afgedrukt, zoals verwacht.

Druk de driehoek van Pascal af met behulp van recursie

In de vorige sectie hebben we de wiskundige uitdrukking van elk item in de Pascal-driehoek geïdentificeerd. We hebben echter geen gebruik gemaakt van de relatie tussen vermeldingen in twee opeenvolgende rijen.

  Het kleurenthema van Microsoft Office wijzigen

In feite hebben we de vorige rij gebruikt om de gegevens in de volgende rij te berekenen. Kunnen we dit niet gebruiken en een recursieve implementatie van de functie pascal_tri bedenken?

Ja, laten we dat doen!

In een recursieve implementatie roept een functie zichzelf herhaaldelijk aan totdat aan het basisgeval is voldaan. Bij de constructie van de driehoek van Pascal beginnen we met de eerste rij met één invoer 1, en bouwen we de volgende rijen.

Dus de functieaanroep naar pascal_tri(numRows) roept op zijn beurt pascal_tri(numRows-1) aan, enzovoort, totdat het basisgeval pascal_tri(1) is bereikt.

Overweeg het voorbeeld waar u de eerste 3 rijen van de driehoek van Pascal moet afdrukken. De volgende afbeelding legt uit hoe de recursieve aanroepen naar de stapel worden gepusht. En hoe de recursieve functieaanroepen de rijen van de driehoek van Pascal retourneren.

Oproepstapel tijdens recursieve oproepen (Afbeelding door de auteur)

▶️ Voer het onderstaande codefragment uit om de rijen van de driehoek van Pascal recursief te genereren.

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

Hier zijn een paar punten die het vermelden waard zijn:

  • We hebben een geneste lijst gebruikt als de gegevensstructuur, waarbij elke rij in de driehoek van Pascal een lijst op zich is, zoals deze: [[row 1], [row 2],…,[row n]].
  • De functieaanroep pascal_tri(numRows) activeert een reeks recursieve aanroepen met numRows – 1, numRows – 2 helemaal tot 1 als de argumenten. Deze calls worden op een stack geduwd.
  • Wanneer numRows == 1, hebben we het basisgeval bereikt, en de functie retourneert [[1]].
  • Nu wordt de geretourneerde lijst gebruikt door de volgende functies in de aanroepstack om de volgende rij te berekenen.
  • Als cur_row de huidige rij is, cur_row[i] = prev_row[i] + prev_row[i+1]—de som van 2 elementen direct boven de huidige index.

Omdat de geretourneerde array een geneste lijst is (lijst met lijsten), moeten we de spatiëring aanpassen en de vermeldingen afdrukken, zoals weergegeven in de onderstaande codecel.

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

De output is correct, zoals hieronder te zien is!

# Output

       1

      1 1

     1 2 1

    1 3 3 1

   1 4 6 4 1

Python-functie om de driehoek van Pascal af te drukken voor numRows ≤ 5

Beide methoden die je hebt geleerd, zullen werken om de driehoek van Pascal af te drukken voor een willekeurig aantal rijen aantalRijen.

Er zijn echter momenten waarop u de driehoek van Pascal voor een kleiner aantal rijen moet afdrukken. En wanneer het aantal rijen dat u moet afdrukken maximaal 5 is, kunt u een eenvoudige techniek gebruiken.

  13 Beste PDF-editorsoftware en onlineservices in 2022

Doorloop de onderstaande figuur. En kijk hoe de machten van 11 identiek zijn aan de vermeldingen in de driehoek van Pascal. Merk ook op dat dit alleen werkt tot de 4e macht van 11. Dat wil zeggen, 11 verheven tot de machten {0, 1, 2, 3, 4} geeft de vermeldingen in rijen 1 tot en met 5 van Pascal’s driehoek.

Laten we de functiedefinitie herschrijven, zoals hieronder weergegeven:

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)))

Zo werkt de functie pascal_tri:

  • Net als bij de vorige voorbeelden passen we de afstand aan.
  • En dan gebruiken we de exponentiatie-operator van Python (**) om de machten van 11 te berekenen.
  • Aangezien de machten van 11 standaard gehele getallen zijn, converteert u ze naar een string met str(). Je hebt nu de machten van 11 als strings.
  • Strings in Python zijn iterables, dus je kunt er doorheen lopen en één teken tegelijk openen.
  • Vervolgens kunt u de methode join() gebruiken met de syntaxis: .join() om elementen in samen te voegen met als scheidingsteken.
  • Hier heb je een enkele spatie tussen de karakters nodig, dus wordt ‘ ‘, is string: macht van 11.

Laten we eens kijken of de functie werkt zoals bedoeld.

pascal_tri(5)

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

Roep als een ander voorbeeld de functie pascal_tri aan met 4 als argument.

pascal_tri(4)

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

Ik hoop dat je weet hoe je de Pascal-driehoek gemakkelijk kunt afdrukken voor numRows in het bereik van 1 tot 5.

Conclusie

Dit is wat we hebben geleerd:

  • Hoe de driehoek van Pascal te construeren met het gegeven aantal rijen. Elk getal in elke rij is de som van de twee getallen er direct boven.
  • Schrijf een Python-functie met de formule nCr = n!/(nr)!.r! om de ingangen van de driehoek van Pascal te berekenen.
  • Vervolgens heb je een recursieve implementatie van de functie geleerd.
  • Ten slotte heb je de meest optimale methode geleerd om de driehoek van Pascal te construeren voor aantalRijen tot 5 – met behulp van de machten van 11.

Als je Python-vaardigheden wilt verbeteren, leer matrices te vermenigvuldigen, te controleren of een getal een priemgetal is en problemen met tekenreeksbewerkingen op te lossen. Veel plezier met coderen!

gerelateerde berichten