rekurzívne funkcie

Príklad 3

Napíšte rekurzívnu funkciu na výpočet súčtu dvoch prirodzených čísel pomocou jednej premennej v parametri funkcie.

Riešenie:

  1. Funkcia má počítať súčet čísel, to znamená, že jej návratový typ bude cele číslo.
    Názov funkcie bude sucet AB.
    Parameter môže byť len jeden, keďže počítame súčet prirodzených čísel, tak parameter bude cele číslo.
    Zatiaľ bude funkcia vyzerať takto:

    function sucetAB(a:integer):integer;
    begin
      ...
    end;

  2. Keby sme mali dve premenné, tak súčet nie je problém vypočítať. My máme k dispozícií len jednu premennú a tá je ako parameter funkcie. Keďže každým zavolaním funkcie sa vytvoria v pamäti jej lokálne premenné (aj premenné v parametri), tak ich môžme počas vykonávania funkcie zmeniť. Túto vlastnosť využijeme neskôr.

    Súčet budeme robiť tak, že funkcií priradíme súčet 1 a funkcie s parametrom o 1 znížením. Teda:

    function sucetAB(a:integer):integer;
    begin
      sucetAB:=1+sucetAB(a-1)
    end;

  3. Otázka je: do kedy môžme znižovať premennú a takto sa rekurzívne vnárať? Odpoveď je jednoduchá, dovtedy pokiaľ a>0. Pretože my sa a-krát vnoríme, na rekurzívnom dne musíme funkcií priradiť nejakú konštantnú hodnotu a pri vynáraní tejto hodnote budeme a-krát pripočítavať 1.
    Na základe tejto úvahy môžme do funkcie doplniť podmienku ukončenia rekurzívneho vnárania.

    function sucetAB(a:integer):integer;
    begin
      if a>0 then sucetAB:=1+sucetAB(a-1)
    end;

  4. Teraz ideme rozhodnúť, aké bude priradenie na rekurzívnom dne. Vieme, že môžme zmeniť hodnotu parametra funkcie ( keďže túto hodnotu nepotrebujeme, lebo ju nikde nevyužívame iba v podmienke. Keď prejdeme cez podmienku tak môžme premennú zmeniť). Využijeme premennú, ktorú máme a ak a=0, tak do tej premennej načítame hodnotu druhého čísla. A potom túto premennú priradíme funkcií.
    Po doplnení príkazov dostávame:

    function sucetAB(a:integer):integer;
    begin
      if a>0 then sucetAB:=1+sucetAB(a-1)
      else begin
          readln(a);
          sucetAB:=a;
        end;
    end;

volanie procedúry: sucetAB(10);