[ nick2 @ 04.12.2010. 17:40 ] @
evo ovako kao i mnogima problem su mi rekurzije, e sad imam zadatak npr da odredim sta neka rekurzija radi, ali naravno rucno na papiru, ok jasno mi je da ona poziva samu sebe do odredjenog uslova i onda stane....

uzmimo za primer ovu rekurziju

function multi(a,b:integer):integer;
var f:integer;
begin
if b=1 then
multi:=a
else
multi:=a*multi(a,b-1);
end;

predpostavim da je a=3 i b=3 //

multi:=3*multi(3,2);
multi=3*multi (3,1) -tu staje jer je b=1
i takodje ja tu stanem ne znam na koju foru dalje da racunam, kako , sta se sabira i kada da bih dobio ono sto treba ???
pomozite mucim se vec 5 dana sa ovim i taman mislim da sa ga nasao kad ono :(
[ Predrag Supurovic @ 04.12.2010. 19:25 ] @
Meni nije jasno sta ti nije jasno. Stvar je prilicno ocigledna.
[ nick2 @ 04.12.2010. 23:49 ] @
pa nije mi jasno kako da resim, sta radi ova rekurzija, kojim sistemom ide, ako bi bili ljubazni korak po korak...tek sam pocetnik pa malo dok se ne uhodam ide teze
[ krle_zr @ 05.12.2010. 07:03 ] @
http://www.gimnazijaso.edu.rs/...red/za-takmicare/rekurzija.php

[ Boris B. @ 06.12.2010. 10:20 ] @
Uzmimo nešto prostije za primer rekurzije, npr računanje faktorijala:

Fakt(3) = 3 * 2 * 1
Fakt(I) = I * (I-1) * (I-2) ... (I-n), dok je n < I

Paskal rešenje:

Code:

function Fakt(N: Integer): Integer
begin
  if N > 1 then
    Result := N * Fakt(N-1)
  else
    Result := 1;
end;


Posmatraj ovo kao da se svaki put kad se dodje do linije Result := N * Fakt(N-1) poziva nova funkcija sa drugim imenom. Druga funkcija ima svoje odvojene promenjive i odvojen rezultat. Ovako izgleda "odmotani" kod kad je N=3:

Code:

function Fakt3: Integer
begin
  Result := 3 * Fakt2();
end;

function Fakt2: Integer
begin
  Result := 2 * Fakt1();
end;

function Fakt1: Integer
begin
  Result := 1;
end;


[ nick2 @ 06.12.2010. 16:23 ] @
hvala svima na odgovorima @Boris B tvoj odgovor sa faktorijalima sam razumeo, nazalost to mi nije pomoglo da shvatim tacno kako da resim moju rekurziju,,, tj, prostije receno sta ona radi (koju operaciju npr)
[ Picsel @ 06.12.2010. 17:45 ] @
Evo na tvom primeru za a=3 i b=3
multi(3,1)=3
multi(3,2)=3*multi(3,1)
multi(3,3)=3*multi(3,2)
Zamenom, dobije se
multi(3,3)=3*multi(3,2)=3*3*multi(3,1)=3*3*3
Ocigledno, funkcija ce se izracunati b puta (u ovom primeru 3 puta). Pri svakom pozivu mnozice se sa a.
Odnosno, tvoja rekurzija vrsi operaciju stepenovanja, a^b.

[ nick2 @ 06.12.2010. 20:19 ] @
ok mislim da sam shvatio, ispravi me ako gresim
onda bi resenje ove bilo

var pom:integer;
function calc (x,y:integer) :integer;
begin
if (y=1) then
calc:=x

else
calc:=calc (x,y-1)+x

end;

predpostavim uzmimo isto x=3 i y=3
1) calc(3,3)=calc (3,2)+3
2) calc (3,2)=calc (3,1)+3
3) calc =3

i sad saberem ove trojke, 3+3+3 to je 9 , znaci ova bi vrsila mnozenje x i y....
tj calc(3,3)=calc(3,2)+3+3=calc(3,1)=3+3+3 =9

[ Picsel @ 07.12.2010. 11:19 ] @
Da.
[ nick2 @ 07.12.2010. 18:39 ] @
hvala puno, pomogli ste mi da shvatim i tu famoznu rekurziju
[ Boris B. @ 09.12.2010. 08:50 ] @
Ne zaboravi samo da je cela poenta rekurzije da svaki rekurzivni poziv ima svoje odvojne promenjive, koje nemaju nikakve veze sa promenjivama iz prethodnog poziva. To je najbitnija stvar, jer inace bi svaki problem mogao jednostavnije da se napise sa obicnom while petljom.
[ devetkamp @ 21.09.2013. 15:27 ] @
Jel moze pomoc oko zadatka?

1. Napisati rekurzivnu funkciju za odredjivanje maksimalnog elementa niza a.

program rekurzija;
type niz=array[1..50] of integer;
var a:niz;
i,n:integer;
function Maxel(n:integer; var a:niz):integer;
var i,max:integer;
begin
max:=a[n];
for i:=1 to n do
if max>a then maxel:=max
else maxel(n-1,a);
end;
begin
readln(n);
begin
for i:=1 to n do
readln(a);
end;
writeln(Maxel(n,a));
end.

Gde gresim? Unapred zahvalan. ;)
[ savkic @ 29.09.2013. 20:14 ] @
Rešenje u Delphiju, ne znam da li ce raditi u čistom Pascalu.

Code:

program rekurzija;
{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  niz = array[1..50] of Integer;

function Maxel(n: Integer; const a: niz): Integer;
var
  Temp: Integer;
begin
  if n > 0 then
  begin
    Result := a[n];

    Temp := Maxel(n - 1, a);

    if Temp > Result then
      Result := Temp;
  end
  else
    Result := Low(Integer);
end;

var
  a: niz;
  i, n: Integer;
begin
  WriteLn('Unesite broj elemanta niza');
  readln(n);
  WriteLn('Unesite elemente niza');
  for i := 1 to n do
    ReadLn(a[i]);

  writeln('Najveci broj u nizu je: ' + IntToStr(Maxel(n, a)));
  Readln;
end.