Napíšte rekurzívnu funkcie na výpočet ciferného súčinu čísel od 1 po n.
Riešenie:
-
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; |
- 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í.
- 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]
|
- 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)
|