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:
- 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; |
- 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; |
- 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. |