program cw3_49;
{ Program oblicza N! za pomocą funkcji Silnia. }
{ Katalog r3_10 : 3_49.pas }
var
N : Byte;
function Silnia (N : Byte) : Longint;
{ Funkcja oblicza silnie liczby N metoda rekurencyjna. } begin
if N - 0 then
Silnia 1
else
Silnia N * Silnia (N-l);
end; {-------------------- Silnia -} begin
Write ('Podaj liczbę: '); Readln (N); Writeln (N, Silnia(N));
Readln; end.
Ależ nam się funkcja uprościła. Pozbyliśmy się dodatkowych zmiennych. Od razu widać, jak działa. Niestety na czasie wykonania nie zyskaliśmy nic (a pewnie mamy trochę strat, biorąc pod uwagę różnice w działaniu pętli for i wielokrotnego wywoływania funkcji).
Przypomnijmy sobie jednak algorytmy, w których rekurencja dawała nam korzyści. Na przykład wyliczanie 2N z ćwiczenia 1.9. A właściwie dlaczego 2? Czy tą metodą nie wyliczymy też szybko i dokładnie potęgi dowolnej liczby całkowitej? Oczywiście, że tak. W rzeczywistości da się tak policzyć nawet potęgę dowolnej liczby, ale ponieważ wejdziemy w obszar obliczeń zmiennopozycyjnych, lepiej skorzystać ze sztuczki z loga-rytmami.
ĆWICZENIE
3.50
Potęga naturalna — rekurencyjnie
Napisz funkcję obliczającą metodą rekurencyjną naturalną potęgę liczby całkowitej i program sprawdzający jej działanie.
Zajrzyjmy do ćwiczenia 1.9, aby przypomnieć sobie nasz rekurencyjny pomysł.
program cw3_50;
{ Program oblicza naturalna potęgę liczby całkowitej }
{ za pomocą funkcji rekurencyjnej. }
{ Katalog r3_10 : 3_50.pas }
var
A : Integer;
N : Byte;
function PotegaCalkowita (A: Integer; N : Byte) : Integer;
{ Funkcja oblicza N-ta potęgę liczby A, dla całkowitego A }
{ i naturalnego N. }
begin
if N-0 then
PotegaCalkowita := 1 else
if (N mod 2-0) then
PotegaCalkowita Sqr (PotegaCalkowita (A, N div 2))