/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
algoritmen for største fælles divisor
Fra : René Holdgard Wilhar~


Dato : 24-10-01 11:24

Hej.

Jeg sidder og piller med en algoritme for største fælles divisor
her er en metode:

private long sfd( long tal1, long tal2)
{
long SFD = 1;

if( tal1 == tal2)
SFD = tal1;

else if( tal1 < tal2)
sfd( tal1, tal2-tal1);

else if( tal1 > tal2)
sfd( tal1-tal2, tal2);

return SFD;
}

Hvis jeg undlader at sætte SFD = 1 brokker cimpileren sig og siger :
*** Error: The variable "SFD" may be accessed here before having been
definitely assigned a value.

Kan en venlig sjæl ikke fortælle mig hvorfor den gør det, jeg ville jo ha'
ment at den til enhver tid ville blive tildelt værdien SFD.

Mvh. René



 
 
Lars Dam (24-10-2001)
Kommentar
Fra : Lars Dam


Dato : 24-10-01 11:24

On Wed, 24 Oct 2001 12:23:39 +0200, "René Holdgard Wilhardt"
<rhw@cadeye.dk> wrote:

>Hej.
>
>Jeg sidder og piller med en algoritme for største fælles divisor
>her er en metode:
>
>private long sfd( long tal1, long tal2)
>{
> long SFD = 1;
>
> if( tal1 == tal2)
> SFD = tal1;
>
> else if( tal1 < tal2)
> sfd( tal1, tal2-tal1);
>
> else if( tal1 > tal2)
> sfd( tal1-tal2, tal2);
>
> return SFD;
>}
>
>Hvis jeg undlader at sætte SFD = 1 brokker cimpileren sig og siger :
>*** Error: The variable "SFD" may be accessed here before having been
>definitely assigned a value.
>
>Kan en venlig sjæl ikke fortælle mig hvorfor den gør det, jeg ville jo ha'
>ment at den til enhver tid ville blive tildelt værdien SFD.

Det gør den ikke. Den bliver kun tildelt i din if(tal1==tal2) sætning.
Når du kalder sfd igen, så vil SFD variablen være en ny lokal instans,
i dit 'næste' kald af sfd().

Det du skal, er at sætte SFD = sfd(...) i ALLE tre kald du har til
sfd()

>Mvh. René
>

vh. ld
---
"Time is the fire in which we burn"

René Holdgard Wilhar~ (24-10-2001)
Kommentar
Fra : René Holdgard Wilhar~


Dato : 24-10-01 11:47

Hej.

Hvis du mener som herunder så giver det mig samme resultat :

long SFD;

if( tal1 == tal2)
SFD = tal1;

else if( tal1 < tal2)
SFD = sfd( tal1, tal2-tal1);

else if( tal1 > tal2)
SFD = sfd( tal1-tal2, tal2);

return SFD;




"Lars Dam" <lars_simple_spam_protection_dam@post2.tele.dk> wrote in message
news:mi5dtto49crejvjf28qh7ss77bhes9cc0l@4ax.com...
> On Wed, 24 Oct 2001 12:23:39 +0200, "René Holdgard Wilhardt"
> <rhw@cadeye.dk> wrote:
>
> >Hej.
> >
> >Jeg sidder og piller med en algoritme for største fælles divisor
> >her er en metode:
> >
> >private long sfd( long tal1, long tal2)
> >{
> > long SFD = 1;
> >
> > if( tal1 == tal2)
> > SFD = tal1;
> >
> > else if( tal1 < tal2)
> > sfd( tal1, tal2-tal1);
> >
> > else if( tal1 > tal2)
> > sfd( tal1-tal2, tal2);
> >
> > return SFD;
> >}
> >
> >Hvis jeg undlader at sætte SFD = 1 brokker cimpileren sig og siger :
> >*** Error: The variable "SFD" may be accessed here before having been
> >definitely assigned a value.
> >
> >Kan en venlig sjæl ikke fortælle mig hvorfor den gør det, jeg ville jo
ha'
> >ment at den til enhver tid ville blive tildelt værdien SFD.
>
> Det gør den ikke. Den bliver kun tildelt i din if(tal1==tal2) sætning.
> Når du kalder sfd igen, så vil SFD variablen være en ny lokal instans,
> i dit 'næste' kald af sfd().
>
> Det du skal, er at sætte SFD = sfd(...) i ALLE tre kald du har til
> sfd()
>
> >Mvh. René
> >
>
> vh. ld
> ---
> "Time is the fire in which we burn"



Martin Moller Peders~ (24-10-2001)
Kommentar
Fra : Martin Moller Peders~


Dato : 24-10-01 12:17

In <3bd69b09$0$25375$edfadb0f@dspool01.news.tele.dk> "René Holdgard Wilhardt" <rhw@cadeye.dk> writes:

>Hej.

>Hvis du mener som herunder så giver det mig samme resultat :

>long SFD;

> if( tal1 == tal2)
> SFD = tal1;

> else if( tal1 < tal2)
> SFD = sfd( tal1, tal2-tal1);

> else if( tal1 > tal2)
> SFD = sfd( tal1-tal2, tal2);

> return SFD;

long SFD;

if( tal1 != tal2) {
if( tal1 < tal2) return sfd( tal1, tal2-tal1);
else return sfd( tal1-tal2, tal2);
}
else {
return SFD;
}
return 0; // dummy kode, der aldrig bliver koert.





Mikkel Bjerg (24-10-2001)
Kommentar
Fra : Mikkel Bjerg


Dato : 24-10-01 12:20

René Holdgard Wilhardt wrote:
>
> Hej.
>
> Hvis du mener som herunder så giver det mig samme resultat :
>
> long SFD;
>
> if( tal1 == tal2)
> SFD = tal1;
>
> else if( tal1 < tal2)
> SFD = sfd( tal1, tal2-tal1);
>
> else if( tal1 > tal2)
> SFD = sfd( tal1-tal2, tal2);
>
> return SFD;
>


Prøv i stedet følgende:

private static long sfd( long tal1, long tal2){
   long SFD;

   if( tal1 == tal2)
    SFD = tal1;
   
   else if( tal1 < tal2)
    SFD = sfd( tal1, tal2-tal1);

   else
    SFD = sfd( tal1-tal2, tal2);
   
   return SFD;
}


Dvs: drop den sidste sammenligning, problemet er at javac ikke ved at de
tre sammenligninger har noget med hinanden at gøre, derfor advarer den
om at du kan risikere at komme igennem alle tre sammenligninger uden at
få givet SFD en værdi.

Derfor; hvis den sidste else ikke har nogen sammenligning, kan java godt
finde ud af at SFD bliver sat i alle kørsler af funktionen
--
MVH

Mikkel Bjerg

Soeren Sandmann (24-10-2001)
Kommentar
Fra : Soeren Sandmann


Dato : 24-10-01 12:42

"René Holdgard Wilhardt" <rhw@cadeye.dk> writes:

> [...]

Vil du ikke være venlig kun at citere det du svarer på og skrive dine
indlæg under den citerede tekst?

> long SFD;
>
> if( tal1 == tal2)
> SFD = tal1;
>
> else if( tal1 < tal2)
> SFD = sfd( tal1, tal2-tal1);
>
> else if( tal1 > tal2)
> SFD = sfd( tal1-tal2, tal2);
>
> return SFD;

Du har ret i at SFD bliver sat til en bestemt værdi uanset værdien af
tal1 og tal2, men compileren er ikke smart nok til at finde ud af det.

For at finde ud af at SFD bliver initialiseret, skal compileren afgøre
at en af de tre betingelser

tal1 == tal2

tal1 < tal2

tal1 > tal2

altid må være opfyldt. Det er sådan set ikke så svært, men hvis de
tre betingelser var mere indviklede, ville det være meget svært,
faktisk umuligt i det generelle tilfælde, for compileren at finde ud
af.

Så Java-compileren vil ikke engang forsøge at afgøre om et af
udtrykkene nødvendigvis må være sandt.

Hvis du skriver

if( tal1 == tal2)
SFD = tal1;

else if( tal1 < tal2)
SFD = sfd( tal1, tal2-tal1);

else
SFD = sfd( tal1-tal2, tal2);

hvor det sidste 'if' ikke er med, kan compileren let se at SFD altid
bliver tildelt en værdi. Det er meget lettere for en compiler at
foretage ræsonnementet:

enten er tal1 == tal2, og så bliver SFD tildelt en værdi. Hvis
ikke, så [enten er tal1 < tal2, og så bliver SFD tildelt en værdi,
eller også er det ikke tilfældet, men så bliver SFD også tildelt en
værdi].

René Holdgard Wilhar~ (24-10-2001)
Kommentar
Fra : René Holdgard Wilhar~


Dato : 24-10-01 12:54

> Vil du ikke være venlig kun at citere det du svarer på og skrive dine
> indlæg under den citerede tekst?
Jo..Det vil jeg da gerne.

Og tusind tak for svaret, det hjalp
René



Ulrik Magnusson (24-10-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 24-10-01 15:35



"René Holdgard Wilhardt" wrote:

> Hej.
>
> Jeg sidder og piller med en algoritme for største fælles divisor
> her er en metode:

Her er en iterativ version - det antages at tal1 og tal2 er større end 0:
Den er lavet en smule hurtigt, men tests viser at den giver de samme
værdier som den rekursive - der er ikke testet for værdier som den
rekursive ikke kunne klare.

static long sfd( long tal1, long tal2)
{
while( true )
{
if( tal1 == tal2 )
{
return tal1;
}
else if( tal1 < tal2 )
{
tal2 = tal2 - tal1;
}
else if( tal1 > tal2 )
{
tal1 = tal1-tal2;
}
}
}


Bo Rasmussen (25-10-2001)
Kommentar
Fra : Bo Rasmussen


Dato : 25-10-01 09:01

Hvad med :

static long sfd( long tal1, long tal2)
{
while( tal1 != tal2){
if( tal1 < tal2 ) tal2 -= tal1;
else tal1 -= tal2;
}
return tal1;
}

Ulrik Magnusson wrote:
>
> "René Holdgard Wilhardt" wrote:
>
> > Hej.
> >
> > Jeg sidder og piller med en algoritme for største fælles divisor
> > her er en metode:
>
> Her er en iterativ version - det antages at tal1 og tal2 er større end 0:
> Den er lavet en smule hurtigt, men tests viser at den giver de samme
> værdier som den rekursive - der er ikke testet for værdier som den
> rekursive ikke kunne klare.
>
> static long sfd( long tal1, long tal2)
> {
> while( true )
> {
> if( tal1 == tal2 )
> {
> return tal1;
> }
> else if( tal1 < tal2 )
> {
> tal2 = tal2 - tal1;
> }
> else if( tal1 > tal2 )
> {
> tal1 = tal1-tal2;
> }
> }
> }

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste