Kā izdrukāt Paskāla trīsstūri programmā Python

Šī apmācība jums iemācīs, kā Python programmā drukāt Paskāla trīsstūri noteiktam rindu skaitam.

Jūs sāksit, iemācoties izveidot Paskāla trīsstūri. Pēc tam turpināsit rakstīt Python funkciju un iemācīties to tālāk optimizēt.

▶️ Sāksim!

Kas ir Paskāla trīsstūris un kā to izveidot?

Paskāla trīsstūra drukāšana noteiktam rindu skaitam ir populārs intervijas jautājums.

Paskāla trīsstūrī ar n rindām rindas numuram i ir i elementi.

Tātad pirmajā rindā ir viens elements, un tas ir 1. Un katrs elements nākamajās rindās ir divu tieši virs tā esošo skaitļu summa.

Nākamajā attēlā ir paskaidrots, kā izveidot Paskāla trīsstūri ar piecām rindām.

Paskāla trijstūris numRows = 5 (autora attēls)

Ņemiet vērā, kā jūs varat ievietot nulles, ja jums ir tikai viens skaitlis virs noteikta skaitļa.

📝Kā ātrs vingrinājums, izpildiet iepriekš aprakstīto procedūru, lai izveidotu Paskāla trīsstūri n = 6 un n = 7.

Tālāk turpināsim rakstīt kādu kodu. Varat izvēlēties palaist koda fragmentus pcdream.lt Python IDE tieši no savas pārlūkprogrammas, veicot apmācību.

Python funkcija Paskāla trīsstūra drukāšanai

Šajā sadaļā uzrakstīsim Python funkciju, lai izdrukātu Paskāla trīsstūri jebkuram noteiktam rindu skaitam.

Ir divi galvenie jautājumi, kas jāapsver:

  • Kā izteikt ierakstus Paskāla trijstūrī?
  • Kā izdrukāt Paskāla trīsstūri ar atbilstošu atstarpi un formatējumu?

Atbildēsim uz tiem tagad.

#1. Kāda ir izteiksme katram Paskāla trijstūra ierakstam?

Gadās, ka ierakstus Paskāla trīsstūrī var iegūt, izmantojot nCr formulu. Ja atceraties no savas skolas matemātikas, nCr apzīmē veidu, kā jūs varat izvēlēties r vienumus no n vienumu kopas.

nCr formula ir dota zemāk:

nCr formula (autora attēls)

Tagad turpināsim izteikt ierakstus Paskāla trīsstūrī, izmantojot nCr formulu.

Paskāla trīsstūra ieraksti, izmantojot nCr (autora attēls)

Tagad esam atraduši veidu, kā izteikt ierakstus matricā.

#2. Kā pielāgot atstarpi, drukājot rakstu?

Paskāla trijstūrī ar numRows rindā #1 ir viens ieraksts, rindā #2 ir divi ieraksti utt. Lai drukātu paraugu kā trīsstūri, #i rindā būs nepieciešamas numRows — i atstarpes. Lai to izdarītu, varat izmantot Python diapazona funkciju kopā ar for cilpu.

  Kā izvēlēties, kuri paplašinājumi tiek rādīti jūsu Edge rīkjoslā

Tā kā diapazona funkcija pēc noklusējuma izslēdz beigu punktu, noteikti pievienojiet + 1, lai iegūtu nepieciešamo sākuma atstarpju skaitu.

Tagad, kad esat iemācījušies attēlot ierakstus un arī pielāgot atstarpi, drukājot Paskāla trīsstūri, turpināsim un definēsim funkciju pascal_tri.

Funkcijas definīcijas parsēšana

Tātad, ko vēlaties, lai funkcija pascal_tri dara?

  • Funkcijai pascal_tri ir jāpieņem rindu skaits (numRows) kā arguments.
  • Tam vajadzētu izdrukāt Paskāla trīsstūri ar numRows.

Lai aprēķinātu faktoriālu, izmantosim faktoriālo funkciju no Python iebūvētā matemātikas moduļa.

▶️ Palaidiet šo koda šūnu, lai importētu faktoriālu un izmantotu to pašreizējā modulī.

from math import factorial

Tālāk esošajā koda fragmentā ir ietverta funkcijas definīcija.

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

Funkcija darbojas šādi:

  • Funkcijai pascal_tri ir viens obligātais parametrs numRows: rindu skaits.
  • Kopā ir numRows rindas. Katrai rindai i mēs pievienojam numRows — i sākuma atstarpes pirms pirmā ieraksta rindā.
  • Pēc tam mēs izmantojam nCr formulu, lai aprēķinātu atsevišķus ierakstus. Rindai i ieraksti ir iCj, kur j = {0,1,2,…,i}.
  • Ievērojiet, ka mēs izmantojam //, kas veic veselu skaitļu dalīšanu, jo mēs vēlētos, lai ieraksti būtu veseli skaitļi.
  • Pēc visu ierakstu aprēķināšanas pēc kārtas izdrukājiet nākamo rindu jaunā rindā.

🔗 Kā esam pievienojuši a dokstring, varat izmantot Python iebūvēto palīdzības funkciju vai atribūtu __doc__, lai piekļūtu funkcijas dokumentu virknei. Tālāk redzamais koda fragments parāda, kā to izdarīt.

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.

Tagad ejam uz priekšu un izsauksim funkciju ar rindu skaitu kā argumentu.

pascal_tri(3)

# Output
     1
    1 1
   1 2 1

Kā paredzēts, tiek izdrukātas Paskāla trīsstūra pirmās 3 rindas.

Drukājiet Paskāla trīsstūri, izmantojot rekursiju

Iepriekšējā sadaļā mēs identificējām katra Paskāla trijstūra ieraksta matemātisko izteiksmi. Tomēr mēs neizmantojām attiecības starp ierakstiem divās secīgās rindās.

Faktiski mēs izmantojām iepriekšējo rindu, lai aprēķinātu ierakstus nākamajā rindā. Vai mēs nevaram to izmantot un nākt klajā ar funkcijas pascal_tri rekursīvu ieviešanu?

  Izveidojiet savu nākamo lietotni, izmantojot šīs atvērtā koda zema koda/bezkoda platformas

Jā, darīsim tā!

Rekursīvā realizācijā funkcija atkārtoti izsauc sevi, līdz tiek izpildīts bāzes gadījums. Paskāla trīsstūra konstrukcijā mēs sākam ar pirmo rindu ar vienu ierakstu 1 un pēc tam veidojam nākamās rindas.

Tātad funkcijas izsaukums pascal_tri(numRows) savukārt izsauc pascal_tri(numRows-1) un tā tālāk, līdz tiek sasniegts pamatgadījums pascal_tri(1).

Apsveriet piemēru, kur jums jādrukā pirmās 3 Paskāla trīsstūra rindas. Nākamajā attēlā ir paskaidrots, kā rekursīvie izsaukumi tiek novirzīti uz steku. Un kā rekursīvie funkciju izsaukumi atgriež Paskāla trīsstūra rindas.

Zvanu steks rekursīvo zvanu laikā (autora attēls)

▶️ Palaidiet tālāk esošo koda fragmentu, lai rekursīvi ģenerētu Paskāla trīsstūra rindas.

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

Šeit ir daži punkti, par kuriem ir vērts pievērst uzmanību:

  • Mēs esam izmantojuši ligzdotu sarakstu kā datu struktūru, kur katra Paskāla trijstūra rinda pati par sevi ir saraksts, piemēram: [[row 1], [row 2],…,[row n]].
  • Funkcijas izsaukums pascal_tri(numRows) aktivizē rekursīvu izsaukumu sēriju ar argumentiem ciparrindas — 1, numRows 2 līdz 1. Šie zvani tiek ievietoti kaudzē.
  • Kad numRows == 1, mēs esam sasnieguši pamata gadījumu, un funkcija atgriežas [[1]].
  • Tagad atgriezto sarakstu izmanto nākamās funkcijas izsaukumu skurstenī, lai aprēķinātu nākamo rindu.
  • Ja cur_row ir pašreizējā rinda, cur_row[i] = iepriekšējā_rinda[i] + iepriekšējā_rinda[i+1]— 2 elementu summa tieši virs pašreizējā indeksa.

Tā kā atgrieztais masīvs ir ligzdots saraksts (sarakstu saraksts), mums ir jāpielāgo atstarpes un jāizdrukā ieraksti, kā parādīts tālāk esošajā koda šū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

Izvade ir pareiza, kā redzams zemāk!

# Output

       1

      1 1

     1 2 1

    1 3 3 1

   1 4 6 4 1

Python funkcija Paskāla trīsstūra drukāšanai numRows ≤ 5

Abas jūsu apgūtās metodes darbosies, lai izdrukātu Paskāla trīsstūri patvaļīgam rindu skaitam numRows.

  Kā atspējot Radeon pārklājumu

Tomēr ir gadījumi, kad ir jādrukā Paskāla trīsstūris mazākam rindu skaitam. Un, ja drukājamo rindu skaits ir ne vairāk kā 5, varat izmantot vienkāršu paņēmienu.

Izejiet cauri zemāk redzamajam attēlam. Un novērojiet, kā 11 pakāpes ir identiskas Paskāla trijstūra ierakstiem. Tāpat ievērojiet, ka tas darbojas tikai līdz 11. pakāpei. Tas ir, 11, kas palielināts līdz pakāpēm {0, 1, 2, 3, 4}, dod ierakstus Paskāla trijstūra rindā no 1. līdz 5. pakāpei.

Pārrakstīsim funkcijas definīciju, kā parādīts zemāk:

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

Lūk, kā darbojas funkcija pascal_tri:

  • Tāpat kā iepriekšējos piemēros, mēs pielāgojam atstarpi.
  • Un pēc tam mēs izmantojam Python paaugstināšanas operatoru (**), lai aprēķinātu 11 pakāpju.
  • Tā kā 11 pakāpes pēc noklusējuma ir veseli skaitļi, konvertējiet tos par virkni, izmantojot str(). Tagad jums ir 11 pilnvaras kā virknes.
  • Python virknes ir iterējamas, lai jūs varētu tām pārvietoties un piekļūt vienai rakstzīmei vienlaikus.
  • Pēc tam varat izmantot join() metodi ar sintaksi: .join(), lai savienotu elementus , izmantojot kā atdalītāju.
  • Šeit starp rakstzīmēm ir nepieciešama viena atstarpe, tāpēc būs ‘ ‘, ir virkne: jauda 11.

Pārbaudīsim, vai funkcija darbojas, kā paredzēts.

pascal_tri(5)

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

Kā citu piemēru izsauciet funkciju pascal_tri ar 4 kā argumentu.

pascal_tri(4)

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

Es ceru, ka jūs saprotat, kā viegli izdrukāt Paskāla trīsstūri numRows diapazonā no 1 līdz 5.

Secinājums

Lūk, ko mēs esam iemācījušies:

  • Kā izveidot Paskāla trīsstūri ar norādīto rindu skaitu. Katrs skaitlis katrā rindā ir divu tieši virs tā esošo skaitļu summa.
  • Uzrakstiet Python funkciju, izmantojot formulu nCr = n!/(nr)!.r! lai aprēķinātu Paskāla trijstūra ierakstus.
  • Pēc tam jūs uzzinājāt funkcijas rekursīvu ieviešanu.
  • Visbeidzot, jūs uzzinājāt visoptimālāko metodi Paskāla trijstūra izveidošanai numRows līdz 5 — izmantojot pakāpju 11.

Ja vēlaties uzlabot Python prasmes, iemācieties reizināt matricas, pārbaudiet, vai skaitlis ir galvenais, un atrisiniet virkņu darbību problēmas. Laimīgu kodēšanu!