rekurzívne funkcie

Príklad 1

Napíšte rekurzívnu funkcie na výpočet ciferného súčinu čísel od 1 po n.

Riešenie:

  1. Názov funkcie bude sucin: function sucin
    parameter funkcie bude číslo n, ktoré reprezentuje súčin n čísel: funtion sucin(n:integer)
    návratový typ funkcie bude číslo, keďže máme vypočítať súčin čísel, teda: funtion sucin(n:integer):integer

    funkcia vyzerať zatiaľ takto:

    function sucin(n:integer):integer;
    Begin
      ...
    end;

  2. Súčin čísle vyzerá takto 1*2*3*4*...*n. Tento súčin môžeme zotriediť aj takto n*(n-1)*(n-2)*...*3*2*1.
    O takto rozdelenom súčine môžme povedať, že je to súčin čísla n a súčin n-1 čísel. O súčine n-1 čísel môžeme povedať, že je do súčin čísla n-1 a súčinu n-2 čísel. Teda súčin čísel od 1 po n môžeme rozdeliť vždy na súčin dvoch častí a to čísla a nejakej časti, ktorú neskôr tiež vieme rozdeliť na súčin dvoch častí.

  3. Rozdelenie vyzerá takto
    n*(n-1)*(n-2)*...*2*1=n* [súcin (n-1) císel]
    (n-1)*(n-2)*...*2*1=(n-1)*[súcin (n-2) císel]
    ...
    3*2*1=3*[súcin 2 císel]
    2*1= 2*[súcin 1 císla]
  4. Podľa rozdelenia násobenia, ako sme si to vysvetlili vyššie upravíme telo funkcie. To znamená, že do súčin priradíme „nejaký“ súčin. Súčin bude tvorený z dvoch častí a to z čísla n a nejakého menšiemu súčinu, ktorý sa vypočíta v rekurzívnom volaní. Teda sucin:=n*[sucin (n-1)čísel] .

    Súčin n-1 čísel sa počíta tak isto, ako súčin n čísel, s tým rozdielom že tam nie je toľko veľa čísel. Namiesto [súčin (n-1)čísel] môžeme napísať súčin(n-1).

    Príkaz bude vyzerať takto: sucin:=n*sucin(n-1).

    Je potrebné ešte určiť „dno“ rekurzívneho vnárania. Vieme, že môžeme robiť súčin čísel, okrem nuly, teda naša funkcia sa bude vnárať dovtedy pokiaľ parameter, ktorý si odovzdáva bude väčší ako 1. Ak parameter bude mať hodnotu 1, tak funkcií priradíme hodnotu 1 a budeme sa vynárať.

    function sucin(n:integer):integer;
    begin
      if n>1 then sucin:=n*sucin(n-1);
    if n=1 then sucin:=1;
    end;

Funkciu môžme zavolať napríklad príkazom sucin(10)