Kezdőoldal » Számítástechnika » Programozás » Tömb elemeinek az összeszorzás...

Tömb elemeinek az összeszorzása és hatványozás rekurzívan pascalban?

Figyelt kérdés

Adott a feladat:Irjunk rekurzív függvényt, ami kiszámolja az a–t a b-ediken.

Ezt a feladatot próbáltam megoldani tömbbel kevés sikerrel mert már nem tudom hogy kell a tömb elemit összeszorozni.

Megpróbáltam úgy hogy a k:=k*t[i] de a k mégis 0 marad.

Kérlek segítsetek akár a teljes feladattal akár csak az összeszorzással kapcsolatban.



2012. máj. 6. 15:31
1 2 3
 1/26 iostream ***** válasza:
75%
Látatlanban kezdd úgy, hogy k = k[0], és 1-től mész a tömb végéig, valószínűleg a k-d default létrejön 0-ra, és utána azt hiába szorozgatod.
2012. máj. 6. 16:49
Hasznos számodra ez a válasz?
 2/26 anonim ***** válasza:

rekurzív függvényhez felesleges tömböket használnod.

lesz a és b, valamint egy szorzat és szamlalo változód

szorzat = 1;

szamlalo = 1;

function hatvany(){

szorzat = szorzat * a;

szamlalo++;

if (szamlalo < b){

hatvany(); //ezért rekurzív, mert itt hívja meg önmagát

}

}

tudom, nem pascalban írtam, de már rég volt, és nincs kedvem előszedni a szintaktikáját

2012. máj. 6. 17:08
Hasznos számodra ez a válasz?
 3/26 anonim ***** válasza:
ööö izé... szamlalo = 0 akar az lenni
2012. máj. 6. 17:09
Hasznos számodra ez a válasz?
 4/26 anonim ***** válasza:

Felesleges ide tömb.

Rekurzív összefüggés:

a^b= a*a^(b-1) , ha b>1

a^b=a, ha b=1

a^b=1, ha b=0

Paraméterbe add át a alapot és kitevőt. A függvény hívja meg önmagát 1-el kevesebb kitevővel és ezt szorozza össze az alappal a megfelelő feltétel szerint.

2012. máj. 6. 18:05
Hasznos számodra ez a válasz?
 5/26 A kérdező kommentje:
Kösz a válaszokat még próbálgatom, nem muszály pascalban lehet c++-ban is ismerem abban is az alapokat de suliban pascalban tanulunk főképpen(egyesek c++-ban).Én úgy képzeltem el a feladatot hogy egy for ciklussal elmegyek a b-ig és annyi számot rakok be a tömbbe amennyi a b és összeszorzo a tömb elemeit.Remélem értitek mire gondolok.Előre is kösz a válaszokat.
2012. máj. 6. 21:55
 6/26 anonim ***** válasza:

Ez nem jó, azt sem tudod mi a rekurzió.

Wikipédia szerint : "A rekurzió a matematikában, valamint a számítógép-tudományban egy olyan művelet, mely végrehajtáskor a saját maga által definiált műveletet, vagy műveletsort hajtja végre, ezáltal önmagát ismétli; a rekurzió ezáltal egy adott absztrakt objektum sokszorozása önhasonló módon."

[link]

Függvények rekurziójára kiváló példa a Fibonacci-sorozat

F(0)=0

F(1)=1

ha n>1 akkor F(n) = F(n − 1) + F(n − 2)

2012. máj. 6. 23:01
Hasznos számodra ez a válasz?
 7/26 zsomkovacs ***** válasza:

Ne csinálj tömböt, attól nem lesz rekurzív, cserébe pazarlod a memóriát és lassítod a programot. A hatványozás így néz ki (ha nem rontom el, rég Pascaloztam, mostanában inkább C++-t használok):


Function hatvany(alap: LongInt, kitevo: Byte): LongInt;

Begin

If (kitevo=0) Then

hatvany:=1

Else

hatvany:=alap*hatvany(alap, kitevo-1);

End;


Vagy egy szintén rekurzív, ám sokkal gyorsabb hatványozás:


Function hatvany(alap: LongInt, kitevo: Byte): LongInt;

Begin

If (kitevo=0) Then

hatvany:=1

Else

Begin

If ((kitevo Mod 2)=0) Then

hatvany:=hatvany(alap, kitevo Div 2)*hatvany(alap, kitevo Div 2)

Else

hatvany:=alap*hatvany(alap, kitevo-1);

End;

End;


Ez a módszer viszont sokkal memóriaigényesebb (persze ez a LongInt mérete miatt nem feltűnő, hamarabb léped túl a méretét, mint hogy ebből gond legyen. De mondjuk c++-ban az első módszer 8 mp alatt számolta ki a 2^10000-t, míg a második 2,5 mp alatt - bár itt már saját típust használtam.)


Esetleg egy nem rekurzív, viszont rövid módszer:


hatvany:=Round(exp(x*ln(alap)));

2012. máj. 7. 09:32
Hasznos számodra ez a válasz?
 8/26 zsomkovacs ***** válasza:

A harmadikban x a kitevő, a másodikban pedig ha definiálsz egy s: LongInt változót, és a (kitevo Mod 2=0) részbe azt írod:


s:=hatvany(alap, kitevo Div 2);

hatvany:=s*s;


akkor gyorsabb és kevesebb memóriát eszik.

2012. máj. 7. 09:36
Hasznos számodra ez a válasz?
 9/26 A kérdező kommentje:

Tudom mi a rekurzió, tudom hogy a for ciklusokat if-re kell átírni csak elöbb megpróbáltam megoldani iteratívan és majd átírni, iteratívan működik,rekurzívan még nem de még próbálkozok.Megpróbáltam a többi módszert is azzal működnek de én megpróbálnám hátha meglehet így is itt az iteratív programom, ezt kéne átírni:

var a,b,k:integer;


function hatvany(a,b:integer;k:real):real;

var t:array[1..99] of integer;

i:integer;

begin

k:=1;

for i:=1 to 99 do

t[i]:=1;

for i:=1 to b do

begin

t[i]:=a;

k:=k*t[i];

end;

hatvany:=k;

end;


begin

readln(a,b);

writeln(hatvany(a,b,k):0:0);

readln;

end.

2012. máj. 7. 20:28
 10/26 A kérdező kommentje:
azért van real-be téve mert ha a b>7 akkor negatív lesz az eredmény, nem tom miért.
2012. máj. 7. 20:31
1 2 3

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!