29. april 2000 - 10:45Der er
9 kommentarer og 1 løsning
Rekursioner og kvadratrod
Er der nogen der kan hjælp mig ? Jeg sidder og arbejder med rekursioner i delphi og er stødt på et problem, nemlig omkring hvordan man rent matematisk beregner kvadratroden. Kan det lade sig gøre med en rekursion ? Det er ok at det kun er kvadrattal (0,1,4,9,16,25 osv.)
Det letteste er vel at gå den anden vej, d.v.s. at gange et tal med sig selv og se om det bliver til det man vil have.
function kvrod(talind : integer) : integer; var i : integer; r : integer; begin result := 0; i := 1; repeat r := i*i; if r = talind then begin result := i; break; end; until (r => talind); end;
Kald denne funktion med det tal du vil finde kvadratroden af.
Denne ganger i med sig selv indtil i * i er lig det tal du vil finde kvadratroden af. Hvis tallet ikke passer bliver r til sidst større end talind og funktionen returnerer med et 0 (nul) ellers returneres kvadratroden af talind.
Det er ganske vist ikke den korrekte mathematiske formel, men den virker for heltal og er såmænd ganske hurtig.
Tjaaa... Hvis det ikke skal være rekursivt (og det lyder det på spørgsmålet som om det skal; en skoleopgave?)så skal du da bruge Delphi's indbyggede funktion
du må hellere lige sende mig en mail til htx98b10@gts.dk så jeg husker det, der er jo lang tid til mandag :)
Til gengæld udregner det program jeg har lavet kvadratroden på den rigtige matematiske måde og den kan derfor tage kvadratroden af et hvilket som helst tal. Den er dog ikke lavet rekursivt.
Hej her er den så, jeg har testet at den virker, så alting skulle være perfect, hvis den skal være rekursiv så kan du evt. finde ud af at lave det der hvor While løkken er, ellers så bliver din lærer nok alligevel lidt forbavset over at du kunne lave den her alligevel sååå :))
--------------------------------------
Function kvadratrod(tal: double):double; var G,U,O: double; a: string; begin U := 0; O := tal; {Istedet for While løkken kan du muligvis lave noget rekursivt} while abs(G*G - tal) > 0.00000001 do begin //nøjagtighed G := (O + U) / 2; //finder det tal midt imellem overværdi og underværdi If G * G > tal Then //tjekker om G^2 er størrer eller mindre end epsilon O := G //ny overværdi Else U := G; //ny underværdi end; G := G + 0.00000001; //runder op a:=floattostr(G); //cutter af sådan at vi kun har de decimaler der ligger inden for nøjagtighedsområdet a:=copy(a,pos('.',a),10); g:=strtofloat(a); result := G; end;
procedure TForm1.Button1Click(Sender: TObject); begin //Dette er kun et test eksempel og du kan bare ændre det til displayet på din lommeregner, men det finder du nok ud af :) edit1.text := floattostr(kvadratrod(strtofloat(edit1.text))); end;
ps: istedet for at bruge pos('.',a) kan du udskifte '.' med den constant der hedder noget med commaseperator i delphi, jeg kunne bare ikke lige huske det rigtige navn for den, derfor brugte jeg '.' da dette er kommaseperatoren i de fleste tilfælde.
Måske en anden kan huske hvad den hedder ?
ellers kan du sikkert finde den i et andet spørgsmål da jeg har set den anvendt før i funktioner postet her på eksperten.dk
jo flere 0 du tilføjer til 0.0000001 jo mere præcis bliver kvadratroden, for du kan tilføje en decimal for hvor 0 der er bagefter, bemærk dog at funktionen bliver en del langsommere af det og en nøjagtighed ned til 7 decimaler plejer også at være mere end rigeligt.
Hvorfor gøre det så besværligt ? kvadratroden af et tal a er lig a^0.5
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.