IMPORT Int COMPLETELY
Real COMPLETELY
IntConv COMPLETELY
DEF prime(n) == IF n=0 THEN false
IF n=1 THEN false
IF n=2 THEN true
IF n>2 THEN keinTeiler( n , 3 )
FI
DEF keinTeiler(n,t) == IF ( (t>n) ) THEN true
IF ( (t<=n) and (n%t|=0) ) THEN keinTeiler( n ,
(t+1) )
IF ( (t<=n) and (n%t=0) ) THEN false
FI
Dieser Algorithmuss ist syntaktisch ok, nur semantisch liefert er nicht
das richtige Ergebnis.
Gruß Marco
du hast da wohl etwas die naive und die verbesserte Version des
Algorithmus durcheinander gebracht. Vielleicht können wir da Abhilfe
schaffen:
marco23 schrieb:
> IF n=2 THEN true
> IF n>2 THEN keinTeiler( n , 3 )
Durch die "3" testest du nur, ob die Zahl durch 3 oder höher teilbar
ist. Du solltest hier bei 2 anfangen, um z.B. auch die Vier zu erwischen.
> DEF keinTeiler(n,t) == IF ( (t>n) ) THEN true
> IF ( (t<=n) and (n%t|=0) ) THEN keinTeiler( n ,
> (t+1) )
> IF ( (t<=n) and (n%t=0) ) THEN false
> FI
Die letzte Fallunterscheidung greift ja immer, wenn t = n ist. Da du
erhöhst, bis dies der Fall ist, ist diese Zeile der Anker der Rekursion.
Du müsstest die Zeilen so ändern, dass der Fall "t = n" nicht mehr auf
die Zeilen 2 und 3 greift, sondern nur auf Zeile 1.
Sprich:
IF t>=n ...
IF t<n and n%t|=0 ...
IF t<n and n%t=0 ...
Ciao,
Robert