Pascal problema! (? )
Szerettem volna osszegszamolast vegezni divide et impera - modszerrel, function (fuggveny) hasznalata nelkul, de nm jott ossze, valamiert nem jon ki a kivant eredmeny.
Itt az eddigi probalkozasom=>>
PROGRAM kuduroooo;
uses crt;
var a:array[1..50] of integer;
n,i,vege,eleje,kozepe,s1:integer;
begin
clrscr;
write('Hany elem legyen=');readln(n);
for i:=1 to n do begin
write('a[',i,']=');readln(a[i]);
end;
vege:=n;
eleje:=1;
s1:=0;
while (eleje<=vege)do begin
kozepe:=(eleje+vege) div 2;
vege:=kozepe;
s1:=s1+(a[eleje]+a[kozepe]);
dec(kozepe);
inc(eleje);
end;
write('A szamok osszege felig=',s1);
readln;
end.
Eszembe nem jutott, sima összegszámolást ilyen módszerrel megoldani, megvan a miértje hogy miért jó használni amikor ezt használják ... Hogy jutott az eszedbe?
Az egész egy rekurzív összefüggésen alapszik, felosztod a tömböt 2 egyenlő részre (ha lehet ha nem akkor az egyik rész 1-el nagyobb) a 2 részre hívod meg az összeg függvényt majd összeadod a részeredményt, akkor ha a számítandó rész 1 elemű akkor az összeg maga az elem.
Függvénnyel így fest (feltéve hogy 0<n<51): [link]
Függvény nélkül is meg lehet írni, csak bonyolultabb. Gondolkozz el azon hogy mi is történik amikor önmagát meghívja a függvény más paraméterekkel és a meghívott függvény is meghívja magát megint más paraméterekkel stb.
Ezek a függvényhívások egy fát alkotnak, tulajdonképpen ezt járuk be valahogy. Ezeken a kérdéseken gondolkodj el: Hogyan? Mi is történik e közben? Ha megvan akkor hogy lehetne implementálni függvény nélkül?
Hat...a fuggvenyest azt mar ertem, de anelkul nem akar sehogyse jo lenni....csak igy sikerul, de igy szerintem nem felel meg a modszernek==>
PROGRAM kuduroooo;
uses crt;
var a:array[1..10] of integer;
n,i,s1,s2:integer;
begin
clrscr;
write('Hany elem legyen=');readln(n);
for i:=1 to n do begin
write('a[',i,']=');readln(a[i]);
end;
s1:=0;
for i:=1 to (n div 2) do
s1:=s1+(a[i]);
writeln('A szamok osszege felig=',s1);
s2:=0;
for i:=(n div 2)+1 to n do
s2:=s2+(a[i]);
writeln('A szamok osszege a masik felig=',s2);
write('A sorozatban levo osszes szam osszege=',(s1+s2));
readln;
end.
@11:00
A módszernek nem felel meg. Ahogy már írtam egy fabejárást kell csinálni (ez történik a rekurziónál is)
Lerajzoltam szemléltetésképp :
n=5 - re [link]
n=8 - ra [link]
A "divide et impera" módszernek megfelelően, a tömbnek előbb az első felét, majd a második felét adjuk össze. Az első felét is meg kell felezni ... Csak így simán ahogy te csináltad úgy sose lesz jó. Le kell rendezni az első felét a tömbnek, a módszer szerint, minden darabnak amire meghívódik a rekurzív függvény van saját(lokális) eleje, kozepe,vege változói úgy hogy ezek nem kavarodnak össze. Megvan a megfelelő hívási sorrend. Ha nem engedjük meg a függvényhívásokat (ezáltal a rekurziót sem) az egyes darabok egymásból következő kiszámítási sorrendjét fenn kell tartani, az előbb említett 3 (eleje,kozepe,vege) változó különböző példányait fenn kell tartani. Erre való a verem adatszerkezet. Pascal-ba implementálni macerás, nekem kéne úgymond szimulálni vermet, vagy ha keresek is verem implementációt azt elég körülményesen tudnám használni ... úgy éreztem hogy sok felesleges pepecselés lenne, habár meg tudnám csinálni, ezért inkább c++-ba csináltam meg és működik. (c++-ba van verem adatszerkezet ...)
Annyit kérek hogy áruld el hogy mire kell, hogy jutott eszedbe?
Gondoltam hogy a "közösbe" rakom, a c++-os impementációm.
Elég részletesen kommenteztem.
Rekurzív számítási algoritmus rekurzió használata nélkül nagyon elbonyolodhat ...
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!