|
| 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;
> }
> }
> }
| |
|
|