Autor Beitrag
coocky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Fr 11.04.08 10:32 
Hallo Leute,
folgendes Problem:
Die Funktion
g : N ---> N,
g( n) := 1/2 n , falls n gerade und
g( n) := 3 n + 1 , falls n ungerade
heißt Collatz-Funktion(L. Collatz, um 1930).
Bezeichnung:
Eine natürliche Zahl n heißt wundersam, wenn es eine natürliche Zahl k gibt mit :
g^k (n) = 1.
Zum Beispiel ist die Zahl 15 wundersam, denn :
15 ---> 46 ---> 23 ---> 70 ---> 35 ---> 106 ---> 53 ---> 160 ---> 80 --->
40 ---> 20 ---> 10 ---> 5 ---> 16 ---> 8 ---> 4 ---> 2 ---> 1


Gibt es dafür einen Algorithmus?

Wir haben schon einmal probiert, das zu implementieren, allerdings stürzt das Programm beim Starten ab

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
 procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormCreate(Sender: TObject);
var zahl1, zahl2 : integer;
    wundersam : Boolean;
begin
zahl1:=StrToInt(Edit1.Text);
Repeat
if zahl1 mod 2 = 0 then
         zahl2:=zahl1 DIV 2
else zahl2:=3*Zahl1+1;
until Zahl2=1;
wundersam:=false;
if zahl2=1 then wundersam:=true;
if wundersam=true then Edit3.Text:='wundersam';
end;


Kann uns jemand helfen?

Vielen Dank im voraus

MFG
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 11.04.08 10:41 
"Stürtzt ab" ist KEINE Fehlerbeschreibung!
Bleibt es hängen, schmeißt es eine Fehlermeldung, explodiert es?


Du hast dir da übrigens eine schöne Endlosschleife gebaut..
Vielleicht solltest du nur mit einer Variablen arbeiten, bzw. den Wert von Zahl1 auch mal verändern, und nicht nur Zahl2?

Und die Variable "wundersam" brauchst du nicht unbedingt.
Du kannst direkt schreiben
ausblenden Delphi-Quelltext
1:
if Zahl2=1 then Edit3.Text := 'wundersam';					
coocky Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Fr 11.04.08 10:53 
naja es bleibt hängen also da kommt diese Benachrichtigung über Debugger-Exception.
Ist das wirklich ne Endlosschleife, wenn das so lange laufen soll bis Zahl2 = 1 ist?
Wir hatten auch erst den Quelltext den du jetzt vorgeschlagen hast aber da kam ne Fehlermeldung, dass wir Boolean-Werte verwenden sollen.
MFG
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 11.04.08 11:09 
user profile iconcoocky hat folgendes geschrieben:
naja es bleibt hängen also da kommt diese Benachrichtigung über Debugger-Exception.
Ist das wirklich ne Endlosschleife, wenn das so lange laufen soll bis Zahl2 = 1 ist?
Wir hatten auch erst den Quelltext den du jetzt vorgeschlagen hast aber da kam ne Fehlermeldung, dass wir Boolean-Werte verwenden sollen.
MFG


1. Bitte gewöhn dir an, präzise Fehlerbeschreibungen zu liefern.. Debugger-Exception kann immernoch so ziemlich alles sein. Diese Exceptions haben normalerweise einen Text, den man abschreiben kann.
2. Ja, das ist eine Endlosschleife. Überleg das ganze doch mal mit deinem Beispiel 15 als Startwert. 15 ist nicht durch 2 teilbar -> else Teil wird ausgeführt. Die neue berechnete Zahl steht in Zahl2, du prüfst aber wieder, ob Zahl1 (immernoch 15!) durch 2 teilbar ist -> wieder der else Teil -> im nächsten Durchlauf prüfst du wieder mit 15, usw.
Zahl2 wird also immer verdreifacht, und kann somit niemals 1 sein (Integer-Überlauf mal ausgenommen).