Πώς να εκτυπώσετε το τρίγωνο του Pascal στην Python

Αυτό το σεμινάριο θα σας διδάξει πώς να εκτυπώνετε το τρίγωνο του Pascal στην Python για έναν δεδομένο αριθμό σειρών.

Θα ξεκινήσετε μαθαίνοντας πώς να κατασκευάζετε το τρίγωνο του Pascal. Στη συνέχεια, θα προχωρήσετε στη σύνταξη μιας συνάρτησης Python και θα μάθετε να τη βελτιστοποιείτε περαιτέρω.

▶️ Ας ξεκινήσουμε!

Τι είναι το τρίγωνο του Πασκάλ και πώς να το κατασκευάσουμε;

Η εκτύπωση του τριγώνου του Pascal για έναν δεδομένο αριθμό σειρών είναι μια δημοφιλής ερώτηση συνέντευξης.

Στο τρίγωνο του Pascal με n σειρές, ο αριθμός σειράς i έχει στοιχεία i.

Έτσι, η πρώτη σειρά έχει ένα στοιχείο, και είναι 1. Και κάθε στοιχείο στις επόμενες σειρές είναι το άθροισμα των δύο αριθμών ακριβώς από πάνω του.

Το παρακάτω σχήμα εξηγεί πώς να κατασκευάσετε το τρίγωνο του Pascal με πέντε σειρές.

Το τρίγωνο του Pascal για numRows = 5 (Εικόνα από τον συγγραφέα)

Παρατηρήστε πώς μπορείτε να πληκτρολογήσετε μηδενικά όταν έχετε μόνο έναν αριθμό πάνω από έναν συγκεκριμένο αριθμό.

📝Σαν γρήγορη άσκηση, ακολουθήστε την παραπάνω διαδικασία για να κατασκευάσετε το τρίγωνο του Pascal για n = 6 και n = 7.

Στη συνέχεια, ας προχωρήσουμε στη σύνταξη κάποιου κώδικα. Μπορείτε να επιλέξετε να εκτελέσετε τα αποσπάσματα κώδικα στο Python IDE του grtechpc.org απευθείας από το πρόγραμμα περιήγησής σας—καθώς προχωράτε στο σεμινάριο.

Λειτουργία Python για την εκτύπωση του τριγώνου του Pascal

Σε αυτήν την ενότητα, ας γράψουμε μια συνάρτηση Python για την εκτύπωση του τριγώνου του Pascal για οποιονδήποτε δεδομένο αριθμό σειρών.

Υπάρχουν δύο βασικά ερωτήματα που πρέπει να ληφθούν υπόψη:

  • Πώς να εκφράσετε τα λήμματα στο τρίγωνο του Pascal;
  • Πώς να εκτυπώσετε το τρίγωνο του Pascal με κατάλληλο διάστημα και μορφοποίηση;

Ας τους απαντήσουμε τώρα.

#1. Ποια είναι η έκφραση για κάθε εγγραφή στο τρίγωνο του Pascal;

Συμβαίνει ότι οι εγγραφές στο τρίγωνο του Pascal μπορούν να ληφθούν χρησιμοποιώντας τον τύπο για nCr. Εάν θυμάστε από τα μαθηματικά του σχολείου σας, το nCr υποδηλώνει τον αριθμό των τρόπων με τους οποίους μπορείτε να επιλέξετε r στοιχεία από ένα σύνολο n στοιχείων.

Ο τύπος για το nCr δίνεται παρακάτω:

Τύπος nCr (Εικόνα από τον συγγραφέα)

Τώρα ας προχωρήσουμε στην έκφραση των εγγραφών στο τρίγωνο του Pascal χρησιμοποιώντας τον τύπο nCr.

Εγγραφές τριγώνου του Pascal με χρήση nCr (Εικόνα από τον συγγραφέα)

  Τι είναι το Reddit Karma και πώς μπορώ να το αποκτήσω;

Τώρα βρήκαμε έναν τρόπο να εκφράσουμε τις εγγραφές στον πίνακα.

#2. Πώς να προσαρμόσετε το διάστημα κατά την εκτύπωση του μοτίβου;

Στο τρίγωνο του Pascal με numRows, η σειρά #1 έχει μία καταχώρηση, η σειρά #2 έχει δύο καταχωρήσεις και ούτω καθεξής. Για να εκτυπώσετε το μοτίβο ως τρίγωνο, θα χρειαστείτε numRows – κενά i στη σειρά #i. Και μπορείτε να χρησιμοποιήσετε τη συνάρτηση εύρους της Python σε συνδυασμό με τον βρόχο for για να το κάνετε αυτό.

Καθώς η συνάρτηση εύρους εξαιρεί το τελικό σημείο από προεπιλογή, φροντίστε να προσθέσετε + 1 για να λάβετε τον απαιτούμενο αριθμό κενών κενών.

Τώρα που μάθατε πώς να αναπαριστάτε καταχωρήσεις και επίσης να προσαρμόζετε χώρο κατά την εκτύπωση του τριγώνου του Pascal, ας προχωρήσουμε και ας ορίσουμε τη συνάρτηση pascal_tri.

Ανάλυση του ορισμού της συνάρτησης

Τι θέλετε λοιπόν να κάνει η συνάρτηση pascal_tri;

  • Η συνάρτηση pascal_tri θα πρέπει να δέχεται τον αριθμό των γραμμών (numRows) ως όρισμα.
  • Θα πρέπει να εκτυπώσει το τρίγωνο του Pascal με numRows.

Για να υπολογίσουμε το παραγοντικό, ας χρησιμοποιήσουμε παραγοντική συνάρτηση από την ενσωματωμένη μαθηματική ενότητα της Python.

▶️ Εκτελέστε το ακόλουθο κελί κώδικα για να εισαγάγετε παραγοντική και χρησιμοποιήστε το στην τρέχουσα λειτουργική μονάδα σας.

from math import factorial

Το παρακάτω απόσπασμα κώδικα περιέχει τον ορισμό της συνάρτησης.

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

Η λειτουργία λειτουργεί ως εξής:

  • Η συνάρτηση pascal_tri έχει μία απαιτούμενη παράμετρο numRows: τον αριθμό των σειρών.
  • Υπάρχουν σειρές numRows σε όλες. Για κάθε σειρά i, προσθέτουμε numRows – i προηγούμενα κενά πριν από την πρώτη καταχώρηση στη σειρά.
  • Στη συνέχεια χρησιμοποιούμε τον τύπο nCr για να υπολογίσουμε τις μεμονωμένες εγγραφές. Για τη σειρά i, οι εγγραφές είναι iCj όπου j = {0,1,2,..,i}.
  • Παρατηρήστε ότι χρησιμοποιούμε // που εκτελεί διαίρεση ακεραίων, καθώς θα θέλαμε οι καταχωρήσεις να είναι ακέραιοι.
  • Αφού υπολογίσετε όλες τις καταχωρήσεις στη σειρά, εκτυπώστε την επόμενη σειρά σε νέα γραμμή.

🔗 Όπως προσθέσαμε ένα docstring, μπορείτε να χρησιμοποιήσετε την ενσωματωμένη συνάρτηση βοήθειας της Python ή το χαρακτηριστικό __doc__ για πρόσβαση στη συμβολοσειρά εγγράφων της συνάρτησης. Το παρακάτω απόσπασμα κώδικα δείχνει πώς να το κάνετε.

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.

Τώρα ας προχωρήσουμε και ας καλέσουμε τη συνάρτηση με τον αριθμό των σειρών ως όρισμα.

pascal_tri(3)

# Output
     1
    1 1
   1 2 1

Οι πρώτες 3 σειρές του τριγώνου του Pascal εκτυπώνονται, όπως αναμενόταν.

  Πώς να αποκτήσετε φωνή Siri με ουδέτερο φύλο σε iPhone, iPad και Mac

Εκτυπώστε το τρίγωνο του Pascal με χρήση αναδρομής

Στην προηγούμενη ενότητα, προσδιορίσαμε τη μαθηματική έκφραση κάθε καταχώρισης στο τρίγωνο Pascal. Ωστόσο, δεν χρησιμοποιήσαμε τη σχέση μεταξύ των καταχωρήσεων σε δύο διαδοχικές σειρές.

Στην πραγματικότητα, χρησιμοποιήσαμε την προηγούμενη σειρά για να υπολογίσουμε τις εγγραφές στην επόμενη σειρά. Μπορούμε να μην το χρησιμοποιήσουμε και να καταλήξουμε σε μια αναδρομική υλοποίηση της συνάρτησης pascal_tri;

Ναι, ας το κάνουμε αυτό!

Σε μια αναδρομική υλοποίηση, μια συνάρτηση καλεί επανειλημμένα τον εαυτό της μέχρι να ικανοποιηθεί η βασική περίπτωση. Στην κατασκευή του τριγώνου του Pascal, ξεκινάμε με την πρώτη σειρά με μία καταχώρηση 1 και στη συνέχεια χτίζουμε τις επόμενες σειρές.

Έτσι, η κλήση της συνάρτησης στο pascal_tri(numRows) καλεί με τη σειρά της το pascal_tri(numRows-1) και ούτω καθεξής, μέχρι να επιτευχθεί η βασική περίπτωση pascal_tri(1).

Εξετάστε το παράδειγμα όπου πρέπει να εκτυπώσετε τις 3 πρώτες σειρές του τριγώνου του Pascal. Η παρακάτω εικόνα εξηγεί πώς οι αναδρομικές κλήσεις προωθούνται στη στοίβα. Και πώς οι κλήσεις της αναδρομικής συνάρτησης επιστρέφουν τις σειρές του τριγώνου του Pascal.

Στοίβα κλήσεων κατά τη διάρκεια επαναλαμβανόμενων κλήσεων (Εικόνα από τον συγγραφέα)

▶️ Εκτελέστε το παρακάτω απόσπασμα κώδικα για να δημιουργήσετε τις σειρές του τριγώνου του Pascal αναδρομικά.

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

Εδώ είναι μερικά σημεία που αξίζει να σημειωθούν:

  • Χρησιμοποιήσαμε μια ένθετη λίστα ως δομή δεδομένων, όπου κάθε γραμμή στο τρίγωνο του Pascal είναι μια λίστα από μόνη της, όπως αυτή: [[row 1], [row 2],…,[row n]].
  • Η κλήση συνάρτησης pascal_tri(numRows) ενεργοποιεί μια σειρά αναδρομικών κλήσεων με numRows – 1, numRows – 2 μέχρι το 1 ως ορίσματα. Αυτές οι κλήσεις προωθούνται σε μια στοίβα.
  • Όταν numRows == 1, έχουμε φτάσει στη βασική περίπτωση και η συνάρτηση επιστρέφει [[1]].
  • Τώρα η επιστρεφόμενη λίστα χρησιμοποιείται από τις επόμενες συναρτήσεις στη στοίβα κλήσεων—για τον υπολογισμό της επόμενης σειράς.
  • Εάν cur_row είναι η τρέχουσα σειρά, cur_row[i] = προηγούμενη_σειρά[i] + prev_row[i+1]—το άθροισμα 2 στοιχείων ακριβώς πάνω από τον τρέχοντα δείκτη.

Καθώς ο πίνακας που επιστράφηκε είναι μια ένθετη λίστα (λίστα λιστών), πρέπει να προσαρμόσουμε το διάστημα και να εκτυπώσουμε τις καταχωρήσεις, όπως φαίνεται στο κελί κώδικα παρακάτω.

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

Η έξοδος είναι σωστή, όπως φαίνεται παρακάτω!

# Output

       1

      1 1

     1 2 1

    1 3 3 1

   1 4 6 4 1

Συνάρτηση Python για εκτύπωση του τριγώνου του Pascal για numRows ≤ 5

Και οι δύο μέθοδοι που έχετε μάθει θα λειτουργήσουν για την εκτύπωση του τριγώνου του Pascal για έναν αυθαίρετο αριθμό σειρών numRows.

  Πώς να αναγνωρίσετε μια ψεύτικη προτροπή εισόδου στην Apple

Ωστόσο, υπάρχουν φορές που χρειάζεται να εκτυπώσετε το τρίγωνο του Pascal για μικρότερο αριθμό σειρών. Και όταν ο αριθμός των σειρών που πρέπει να εκτυπώσετε είναι το πολύ 5 — μπορείτε να χρησιμοποιήσετε μια απλή τεχνική.

Μεταβείτε στο παρακάτω σχήμα. Και παρατηρήστε πώς οι δυνάμεις του 11 είναι ταυτόσημες με τις εγγραφές στο τρίγωνο του Πασκάλ. Επίσης, προσέξτε ότι αυτό λειτουργεί μόνο μέχρι την 4η δύναμη του 11. Δηλαδή, το 11 ανυψωμένο στις δυνάμεις {0, 1, 2, 3, 4} δίνει τις εγγραφές στις σειρές 1 έως 5 του τριγώνου του Πασκάλ.

Ας ξαναγράψουμε τον ορισμό της συνάρτησης, όπως φαίνεται παρακάτω:

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

Δείτε πώς λειτουργεί η συνάρτηση pascal_tri:

  • Όπως και στα προηγούμενα παραδείγματα, προσαρμόζουμε την απόσταση.
  • Και μετά, χρησιμοποιούμε τον τελεστή εκθέσεως της Python (**) για να υπολογίσουμε τις δυνάμεις του 11.
  • Καθώς οι δυνάμεις του 11 είναι ακέραιοι από προεπιλογή, μετατρέψτε τις σε συμβολοσειρά χρησιμοποιώντας το str(). Τώρα έχετε τις δυνάμεις του 11 ως χορδές.
  • Οι συμβολοσειρές στην Python είναι επαναλαμβανόμενες—έτσι μπορείτε να τις επαναλαμβάνετε και να έχετε πρόσβαση σε έναν χαρακτήρα κάθε φορά.
  • Στη συνέχεια, μπορείτε να χρησιμοποιήσετε τη μέθοδο join() με τη σύνταξη: .join() για να ενώσετε στοιχεία στο χρησιμοποιώντας το ως διαχωριστικό.
  • Εδώ, χρειάζεστε ένα ενιαίο κενό μεταξύ των χαρακτήρων, οπότε το θα είναι ‘ ‘, το είναι συμβολοσειρά: δύναμη 11.

Ας ελέγξουμε αν η λειτουργία λειτουργεί όπως προβλέπεται.

pascal_tri(5)

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

Ως άλλο παράδειγμα, καλέστε τη συνάρτηση pascal_tri με το 4 ως όρισμα.

pascal_tri(4)

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

Ελπίζω να καταλαβαίνετε πώς μπορείτε να εκτυπώσετε εύκολα το τρίγωνο Pascal για numRows στην περιοχή 1 έως 5.

συμπέρασμα

Να τι μάθαμε:

  • Πώς να κατασκευάσετε το τρίγωνο του Pascal με τον δεδομένο αριθμό σειρών. Κάθε αριθμός σε κάθε σειρά είναι το άθροισμα των δύο αριθμών ακριβώς από πάνω του.
  • Γράψτε μια συνάρτηση Python χρησιμοποιώντας τον τύπο nCr = n!/(nr)!.r! για να υπολογίσετε τις εγγραφές του τριγώνου του Pascal.
  • Στη συνέχεια μάθατε μια αναδρομική υλοποίηση της συνάρτησης.
  • Τέλος, μάθατε την πιο βέλτιστη μέθοδο για την κατασκευή του τριγώνου του Pascal για numRows έως 5—χρησιμοποιώντας τις δυνάμεις του 11.

Αν θέλετε να ανεβάσετε τις δεξιότητες της Python, μάθετε να πολλαπλασιάζετε πίνακες, ελέγξτε αν ένας αριθμός είναι πρώτος και λύστε προβλήματα σε πράξεις συμβολοσειράς. Καλή κωδικοποίηση!