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