Рекурзивне функције у Питхону

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

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

БелешкаВажно је бити јасан у вези са основним случајем и знати да му се рекурзивни случај све више приближава и не улази у стање бесконачних позива, то је уобичајена грешка при започињању рекурзије.

Пређимо на примере који ће бити једноставни и кратки како би се могли добро усвојити.

Пример 1 - Факторијално


У овом примеру ћемо реши факторијел бројаАко желите да знате о чему се ради факторијал, посетите ову везу. Ево кода, а испод објашњавам рекурзивну функцију.
 деф фацториал (нумбер): иф (нумбер == 0 ор нумбер == 1): ретурн 1 елсе: ретурн нумбер * фацториал (нумбер-1) иф __наме__ == "__маин__": три: нум = инт (инпут ("Од За који број желите да знате факторијел? ")) Иф (нум <0): принт (" Број мора бити већи или једнак 0 ") елсе: принт (" Фактор од ", нум," ис ", фацториал (нум)) осим: принт (" Очекује се број ") 
Наша рекурзивна функција има основни случај у иф, а рекурзивна у елсе. Можете видети да основни случај враћа 1 и да је то постигнуто када је параметар прослеђен функцији 0 или 1, када се овај случај достигне функција се не позива поново. У рекурзивном случају имамо позив саме функције, али како видите смањење параметра за 1 (приближавамо се основном случају). Последњи део кода изван функције одговоран је само за тражење броја од корисника и проверу да ли је већи или једнак 0 за позивање функције, јер факторијал са негативним бројевима не ради.

Ако позовемо функцију са бројем 4, односно факторијелом (4), имамо следеће позиве:

 Позив 1: факторски (4) Позив 2: 4 * факторски (3) Позив 3: 3 * факторски (2) Позив 4: 2 * факторски (1)
Приликом позивања факториала са 1, нема више позива и вратиће 1, онда ова функција враћа резултате враћајући функцији коју ја зовем, повратак би био овакав:
 факторијал (1) = 1 факторијал (2) = 2 * 1 факторијал (3) = 3 * 2 факторијал (4) = 4 * 6
И већ имамо наш резултат, који је 24, од множења бројева: 1 * 2 * 3 * 4. Затим остављам снимак екрана када тражим факторијел од 5, што није ништа друго него множење 5 са ​​факторијелом 4 (за које већ знамо да је 24) дајући као резултат 120. Такође можете видети да ако корисник унесе број погрешно, то је:

Пример 2 - Сабирање / одузимање


У овом примеру стављам рекурзивну функцију за сабирање или одузимање, наравно да се овај пример обично не јавља у стварном животу, али као пример функционише:
 деф операција (број1, број2): иф (број2 == 0): врати број1 елиф (број2 <0): врати операцију (број1-1, број2 + 1) иначе: врати операцију (број1 + 1, број2-1) ако __наме__ == "__маин__": принт ("Додавање 10 и 3:", операција (10, 3)) принт ("Додавање 5 и -2:", управљање (5, -2)) 
Овде имамо основни случај и 2 рекурзивна случаја, ово је да знамо који начин да додирнемо, јер ћемо у зависности од тога да ли је број позитиван или негативан морати да се понашамо другачије. Оперативна функција прима 2 броја, а алгоритам ће се побринути за одузимање или додавање једног броју 2 и његово преношење у број 1 (Ако је број 2 позитиван, одузимам 1 од броја2 и додајем га броју 1), дакле све док променљива број 2 не буде једнака до 0.

На пример, додаћемо 3 + 2 гледајући позиве.

 Позив 1: рад (3,2) Позив 2: рад (4,1) Позив 3: рад (5,0)
У овом случају, када почнемо да оперишемо (5,0) нема шта друго да радимо, имамо резултат директно (за разлику од случаја с факторијелом који је морао да изврши множење). Ево резултата извршавања кода:

БелешкаИако с рекурзијом имамо елегантно рјешење и обично краће, требало би га користити када немамо другу опцију, ако га можемо повући кроз његову итеративну варијанту, то ће бити бољи избор, јер троши мање меморије и обично је бржи.

Да ли вам се допао и помогао овај водич?Можете наградити аутора притиском на ово дугме да бисте му дали позитиван поен
wave wave wave wave wave