|
[ 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 ] @
[ 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.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|