Błąd w programie obliczający silnie rekurencyjnie


(szpon5) #1

Witam serdecznie, mam program który oblicza silnie metodą rekurencyjną, ale coś nie chce działać, nie mam pojęcia dlaczego. Bardzo bym prosił o poprawienie go. Wiem, że chodzi o coś z Begin, tylko tyle :x

{program liczy funkcje metoda rekurencjna}

program s;

uses

  crt;


function silnia(n:integer):integer; //funkcja liczaca rekurencyjnie silnie

begin

  if (n=0) or (n=1) then

    result:=1

  else

    result:=silnia(n-1)*n;

end;


var

  n:integer;

begin

  repeat

    write('Podaj dla jakiego n chcesz obliczac: ');

    readln(n);

    if n<0 then

      writeln('Nie ma silni z liczb ujemnych');

  until n>=0;

  writeln(n,'!= ',silnia(n)); //wywolanie funkcji liczacej silnie

  readln;

end.

(Masosz) #2

function silnia(n:integer):integer;

begin

if (n=0) or (n=1) then

silnia:=1

else

silnia:=silnia(n-1)*n;

end;


(szpon5) #3

Dziękuję ci bardzo a mam jeszcze jeden. On działa, ale po ukazaniu się wyniku program wyłącza się i powraca do kodu źródłowego. Aby zobaczyć wynik silni muszę z powrotem wejść w uruchomienie programu, bardzo bym prosił o poprawienie tego małego błędu.

Jeśli nie bardzo wiecie o co chodzi to wystarczy skopiować poniższy kod do notatnika, zapisać z rozszerzeniem pas i otworzyć w pascalu.

{Program obliczajacy silnie metoda rekurencyjna}

program SilniaRekurencyjna;

uses crt;

{Obliczanie wartosci silni}

function silnia(n: longint): longint;

begin

clrscr;

if n=0 then

begin

silnia :=1;

exit

end;

silnia :=n * silnia(n-1)

end;

var

kk: longint;

begin

write ('Podaj liczbe naturalna: ');

read(k);

writeln(k, '! = ',silnia(k))

end.

(Krzkaczor) #4

Na końcu readln?


(szpon5) #5

Readln; nie daję się na samym końcu tylko przed end.

Poza tym po wstawieniu readln; program w ogóle się nie uruchamia, informuje, że jakiś problem ze; itp.


(Krzkaczor) #6

OMG mówiąc na końcu oczywiście miałem na myśli przed end. A sprobuj ja koncu dać

read(jakas_zmienna);

i tyle


(szpon5) #7

Ale już niemal na samym końcu jest podane read(k);. Proszę o więcej porad.


(Krzkaczor) #8

No właśnie prawie na końcu... Chodzi o to żeby program się zatrzymał.


(szpon5) #9

Niestety nie działa, też tam kombinowałem, próbowałem dawać w innych miejscach readln, inne zmienne itp.., ale lipa

Bardzo proszę o pomoc.


(szpon5) #10

Naprawdę nikt nie wie jak naprawić ten mały błąd :frowning:


(Sanctuarius) #11
{Program obliczajacy silnie metoda rekurencyjna}

program SilniaRekurencyjna;

uses crt;

{Obliczanie wartosci silni}

function silnia(n: longint): longint;

begin

clrscr;

if n=0 then

begin

silnia :=1;

exit

end;

silnia :=n * silnia(n-1)

end;

var

kk: longint;

begin

write ('Podaj liczbe naturalna: ');

read(k);

writeln(k, '! = ',silnia(k));

readln;

end.

Na moje wystarczy cos takiego :slight_smile: hmm tak jak poprzednicy pisali:)


(szpon5) #12

Nie działa, trzeba zmienić kk: longint; na k: longint; (czyli jedno k ma być), ale i tak nie działa poprawnie tak jak pisałem wcześniej.

Program się uruchamia, ale po ukazaniu wyniku program wyłącza się i powraca do kodu źródłowego. Aby zobaczyć wynik silni muszę z powrotem wejść w uruchomienie programu, bardzo bym prosił o poprawienie tego małego błędu.

Jeśli nie bardzo wiecie o co chodzi to wystarczy skopiować poniższy kod do notatnika, zapisać z rozszerzeniem pas i otworzyć w pascalu.


(Kr2y5i3k) #13
{Program obliczajacy silnie metoda rekurencyjna}

program SilniaRekurencyjna;

uses crt;

{Obliczanie wartosci silni}

function silnia(n: longint): longint;

begin

if n=0 then

 begin

 silnia :=1;

 exit;

 end

else

silnia :=n * silnia(n-1)

end;

var

k: longint;

begin

clrscr;

write ('Podaj liczbe naturalna: ');

read(k);

readln;

writeln(k, '! = ',silnia(k));

readln;

end.

Poprawione :slight_smile: U mnie działa :stuck_out_tongue:


(szpon5) #14

Dzięki wielkie


(Kr2y5i3k) #15

nie ma za co :slight_smile: Pozdrawiam