priama rekurzia

Príklad 3

Napíšte rekurzívnu procedúru, ktorá sčíta prirodzené čísla A  a  B bez použitia sčítania týchto dvoch čísel, aj bez použiťia tretej premennej.

Riešenie:
  1. Ak máme spočítať dve čísle a nemôžme použiť sčítanie, vieme jedno číslo rozpísať ako súčet jednotiek. Napríklad ak A=3 a B=5, tak A=3=1+1+1. Najprv musíme nájsť spôsob, ako spočítať tieto čísla. Jeden spôsob je, že od jedného čísla budeme po jednotkách odčítavať a k druhému pripočítavať tie jednotky (inak povedané, to čo z jednej strany zoberieme, dáme na druhú stranu).

    Príkazy by mali vyzerať takto: a=a-1 a b=b+1

    Keďže tieto úpravy vieme robiť a v parametri procedúry tak môžme napísať takto:

    procedure sucet (a,b:integer);
    begin
      sucet(a-1,b+1);
    end;

  2. Takáto procedúra sa bude vykonávať donekonečna, preto je potrebné doplniť podmienku ukončenia. Vieme, že ak sa z jedného čísla odčítava, tak sa odpočítavať môže len po 0. Teda podmienka ukončenia bude ak a>0 tak odčítaj.
    Doplnené príkazy:

    procedure sucet (a,b:integer);
    begin
    if a>0 then
      sucet(a-1,b+1);
    end;

  3. Máme napísanú aj podmienku ukončenia rekurzívneho vnárania. Ak a=0, tak v b bude hodnota a pripočítaná, v tom prípade je potrebné hodnotu b vypísať. Do procedúry je potrebné doplniť príkaz výpisu hodnoty b do vetvy else.

    procedure sucet (a,b:integer);
    begin
    if a>0 then
      sucet(a-1,b+1);
    else writeln('sucet cisel je ',b);
    end;

Táto procedúra bude z prvého parametra odpočítavať jednotku a k druhému parametru tú jednotku pripočítavať. Toto sa bude vykonávať pokiaľ prvý parameter je väčší ako 0. Ak je jeho hodnota nulová, tak rovnaký počet jednotiek sa odpočíta z prvého parametra a taký istý počet jednotiek sa pripočíta k druhému parametru. Na záver v parametri b je súčet čísel a, b, ktoré sme na začiatku zadali.