У овој лекцији ћемо научити да функција може да позива саму себе! Овај врло користан приступ се назива рекурзија.
Пример:
У нашој лекцији о петљама, користили смо петљу while да добијемо следећи излаз.
5
4
3
2
1
Buuum!
Ево програма који користи рекурзију, са истим резултатом:
За следећи пример ћемо имати неке реченице за штампање да бисмо лакше разумели како програм ради. Ова верзија програма учитава временски лимит из улаза.
Сада ћемо видети како ово функционише корак по корак. Када је улаз 5, програм прво позива копију функције odbrojavanje са n=5, која штампа 5 и позива odbrojavanje(4). Ово се наставља до odbrojavanje(0), која штампа "Buuum" и више не позива одбројавање. Када Python заврши са позивањем odbrojavanje функције када је n=0, Python се враћа на функцију која ју је позвала, што је odbrojavanje са n=1. Онда се враћамо на позивање са n=2 и тако даље.
Оно што раздваја рекурзију од функција које смо раније видели је то што више верзија функције ради истовремено. То смо отприлике и видели у горњој визуализацији, где је једна функција позвала другу, тј. у овом случају саму себе.
Сада је време да ви напишете код. Подесите функцију одбројавање тако да броји унапред уместо уназад.
Хајде сада да подесимо наш програм brojanje, тако да броји у размацима од 2. Излаз би требало да буде 5, 3, 1, Buuum! Променићемо аргумент функције n-1 у n-2. Шта мислите, треба ли још нешто да променимо у следећем примеру?
Видимо да овај програм не ради као што смо намеравали. Одштампао је 5, 3, 1, као што смо желели, али, уместо да стане, наставио је са -1, -3, -5 до бесконачности.
Када правимо рекурзивне функције, морамо да пазимо да оне не оду у бесконачност! Исправите програм odbrojavanjePo2, тако да се заустави на 1 (или 2, ако је n парно) и одштампа 'Buuum!'
Дизајнирање рекурзивних функција
Рекурзивна функција је функција која позива саму себе. Али мора постоји ситуација у којој функција неће позивати себе, или ће програм ићи до бесконачности, као што смо видели у примеру изнад. Део рекурзивне функције где она не позива саму себе се назива основни случај. У горњем примеру је основни случај био n<=0. Дизајнирање рекурзивне функције тражи да се пажљиво одабере основни случај и да свака секвенца позива функције на крају стигне до основног случаја.
У следећој вежби већ имате испрограмиран основни случај, али ћете сами написати остатак рекурзивне функције.
def enigma(a, b): if b == 0: return a return enigma (b, a % b) print(enigma (20, 12))