Како одштампати Пасцалов троугао у Питхон-у

Овај водич ће вас научити како да одштампате Пасцалов троугао у Питхон-у за дати број редова.

Почећете тако што ћете научити како да конструишете Паскалов троугао. Затим ћете наставити да пишете Питхон функцију и научите да је даље оптимизујете.

▶ Почнимо!

Шта је Пасцалов троугао и како га конструисати?

Штампање Пасцаловог троугла за дати број редова је популарно питање за интервју.

У Пасцаловом троуглу са н редова, ред број и има и елемената.

Дакле, први ред има један елемент, и то је 1. И сваки елемент у наредним редовима је збир два броја директно изнад њега.

Следећа слика објашњава како да се конструише Пасцалов троугао са пет редова.

Паскалов троугао за број редова = 5 (Слика аутора)

Обратите пажњу како можете додати нуле када имате само један број изнад одређеног броја.

📝Као брзу вежбу, пратите горњу процедуру да бисте конструисали Паскалов троугао за н = 6 и н = 7.

Затим наставимо са писањем неког кода. Можете изабрати да покренете исечке кода на вдзвдз-овом Питхон ИДЕ-у директно из свог претраживача— док будете пролазили кроз водич.

Питхон функција за штампање Пасцаловог троугла

У овом одељку, хајде да напишемо Питхон функцију за штампање Пасцаловог троугла за било који број редова.

Постоје два кључна питања која треба размотрити:

  • Како изразити уносе у Паскаловом троуглу?
  • Како одштампати Пасцалов троугао са одговарајућим размаком и форматирањем?

Хајде да им одговоримо сада.

#1. Који је израз за сваки унос у Паскаловом троуглу?

Дешава се да се уноси у Паскалов троугао могу добити помоћу формуле за нЦр. Ако се сећате из школске математике, нЦр означава број начина на које можете изабрати р ставки из скупа од н ставки.

Формула за нЦр је дата у наставку:

нЦр формула (Слика аутора)

Сада наставимо да изражавамо уносе у Пасцаловом троуглу користећи нЦр формулу.

Паскалови уноси троугла користећи нЦр (Слика аутора)

Сада смо пронашли начин да изразимо уносе у матрици.

  Најбољи заштитници екрана за Самсунг Галаки С24 у 2024

#2. Како подесити размак приликом штампања шаблона?

У Пасцаловом троуглу са нумРовс, ред #1 има један унос, ред #2 има два уноса, и тако даље. Да бисте одштампали образац као троугао, требаће вам нумРовс – и размаци у реду #и. И можете користити Пајтонову функцију опсега у комбинацији са фор петљом да бисте то урадили.

Пошто функција опсега подразумевано искључује крајњу тачку, обавезно додајте + 1 да бисте добили потребан број водећих размака.

Сада када сте научили како да представите уносе и да прилагодите простор док штампате Пасцалов троугао, идемо даље и дефинишемо функцију пасцал_три.

Рашчлањивање дефиниције функције

Дакле, шта желите да функција пасцал_три ради?

  • Функција пасцал_три треба да прихвати број редова (нумРовс) као аргумент.
  • Требало би да одштампа Пасцалов троугао са нумРовс.

Да бисмо израчунали факторијел, користимо факторијалну функцију из Питхон-овог уграђеног математичког модула.

▶ Покрените следећу ћелију кода да увезете факторијел и користите га у свом тренутном модулу.

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

Функција ради на следећи начин:

  • Функција пасцал_три има један обавезни параметар нумРовс: број редова.
  • Све има нумРовс редова. За сваки ред и додајемо нумРовс – и водеће размаке пре првог уноса у реду.
  • Затим користимо формулу нЦр за израчунавање појединачних уноса. За ред и, уноси су иЦј где је ј = {0,1,2,..,и}.
  • Обратите пажњу на то да користимо // који врши целобројно дељење, јер бисмо желели да уноси буду цели бројеви.
  • Након што израчунате све уносе у низу, одштампајте следећи ред у новом реду.

🔗 Како смо додали а доцстринг, можете користити Питхон-ову уграђену функцију помоћи или атрибут __доц__ да бисте приступили низу докумената функције. Исечак кода испод показује како се то ради.

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 реда Паскаловог троугла су штампана, као што се и очекивало.

  Како користити Схазам унутар Снапцхата да бисте пронашли и слушали песме

Штампајте Пасцалов троугао користећи рекурзију

У претходном одељку смо идентификовали математички израз сваког уноса у Пасцал троуглу. Међутим, нисмо користили однос између уноса у два узастопна реда.

У ствари, користили смо претходни ред да израчунамо уносе у следећем реду. Можемо ли ово да искористимо и смислимо рекурзивну имплементацију функције пасцал_три?

Да, урадимо то!

У рекурзивној имплементацији, функција више пута позива саму себе док се не испуни основни случај. У конструкцији Паскаловог троугла, почињемо од првог реда са једним уносом 1, а затим градимо следеће редове.

Дакле, позив функције пасцал_три(нумРовс) заузврат позива пасцал_три(нумРовс-1) и тако даље, док се не достигне основни случај пасцал_три(1).

Размотрите пример где треба да одштампате прва 3 реда Паскаловог троугла. Следећа слика објашњава како се рекурзивни позиви гурају у стек. И како рекурзивни позиви функције враћају редове Паскаловог троугла.

Група позива током рекурзивних позива (Слика аутора)

▶ Покрените исечак кода испод да генеришете редове Пасцаловог троугла рекурзивно.

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

Ево неколико тачака на које вреди обратити пажњу:

  • Користили смо угнежђену листу као структуру података, где је сваки ред у Пасцаловом троуглу листа за себе, овако: [[row 1], [row 2],…,[row n]].
  • Позив функције пасцал_три(нумРовс) покреће серију рекурзивних позива са нумРовс – 1, нумРовс – 2 све до 1 као аргументима. Ови позиви се гурају у стек.
  • Када је нумРовс == 1, дошли смо до основног случаја и функција се враћа [[1]].
  • Сада враћену листу користе следеће функције у стеку позива—за израчунавање следећег реда.
  • Ако је цур_ров тренутни ред, цур_ров[i] = претходни_ред[i] + претходни_ред[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

Питхон функција за штампање Пасцаловог троугла за број редова ≤ 5

Обе методе које сте научили ће радити на штампању Пасцаловог троугла за произвољан број редова нумРовс.

  10 најбољих прикључних станица за коришћење више уређаја одједном

Међутим, постоје случајеви када је потребно да одштампате Пасцалов троугао за мањи број редова. А када је број редова које треба да одштампате највише 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)))

Ево како функционише функција пасцал_три:

  • Као иу претходним примерима, прилагођавамо размак.
  • А затим користимо Пајтонов оператор експоненцијације (**) да бисмо израчунали степене 11.
  • Пошто су степена 11 подразумевано цели бројеви, конвертујте их у стринг користећи стр(). Сада имате моћи 11 као низове.
  • Стрингови у Питхон-у су итерабле—тако да можете проћи кроз њих и приступити једном по једном знаку.
  • Затим можете користити метод јоин() са синтаксом: <сеп>.јоин(<итерабле>) да бисте спојили елементе у <итерабле> користећи <сеп> као сепаратор.
  • Овде вам је потребан један размак између знакова, тако да ће <сеп> бити ‘ ‘, <итерабле> је стринг: снага 11.

Хајде да проверимо да ли функција ради како треба.

pascal_tri(5)

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

Као други пример, позовите функцију пасцал_три са 4 као аргументом.

pascal_tri(4)

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

Надам се да знате како можете лако да одштампате Пасцал троугао за нумРовс у опсегу од 1 до 5.

Закључак

Ево шта смо научили:

  • Како конструисати Паскалов троугао са датим бројем редова. Сваки број у сваком реду је збир два броја директно изнад њега.
  • Напишите Питхон функцију користећи формулу нЦр = н!/(нр)!.р! за израчунавање уноса Паскаловог троугла.
  • Затим сте научили рекурзивну имплементацију функције.
  • Коначно, научили сте најоптималнији метод за конструисање Паскаловог троугла за број редова до 5—користећи степене 11.

Ако желите да унапредите Питхон вештине, научите да множите матрице, проверите да ли је број прост и решите проблеме са стринг операцијама. Срећно кодирање!