Autor |
Beitrag |
Jonny Leue (Irontears)
| Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 05:26: |
|
Also wir sollen ein Pascal-Programm zur Ackermann-Funktion schreiben und Ergebnisse zu 2 vorgegebenen Werten herausfinden! Tja ack(3,6) geht ja noch aber ack(4,1) endet das Programm an einen Überlauf (d.h. der Wertebereich der Variablendekleration wurde überschritten): Meine Frage kann mir einer sagen wie ich dies hier verändern muß um einen Wert zu erhalten oder ist der Wert einfach zu hoch für einen "simplen" PC? Quellcode ausschnitt: function ack(x,y: Double):Double; {hab schon vorher mit Integer und real laufen lassen, ging schneller aber nix, klar real < double} begin if x=0 then ack:=y+1 else if y=0 then ack:=ack(x-1, 1) else ack:=ack(x-1, ack(x, y-1)); end; Hab leider keine Referenz für Pascal (benutze VPascal) die mir sagen könnte welcher Variablentyp größer ist als double! Aber kann es wirklich sein das die zahl > z.B 10^100 ist? mfg Jonny PS: Ja ich weis das das Programmierungstechnik ist und nicht direkt Mathe für Inf, aber schliesslich ist es eine Mathe Aufgabe! *weisssonstnichtwohin* |
Zaph (Zaph)
| Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 07:24: |
|
f(4,1) = 65533 ? Siehe hier |
SpockGeiger (Spockgeiger)
| Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 10:31: |
|
Hi Jonny Der Überlauf liegt wahrscheinlich nicht am Zahlenbereich, sondern an der Rekursionstiefe. Schau Dir die Fehlermeldung nochmal genau an. Wenn es ein Stack-Overflow bzw. ein Stapel-Überlauf ist, dann liegt es daran. viele Grüße SpockGeiger |
Jonny Leue (Irontears)
| Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 12:48: |
|
Also "Can't grow the stack" ist wohl ein Stack-Überlauf gemeint, hab ihn auch schon mit {$M} auf 64 MB gebracht, aber nix! Wat nu??? *heul* (Muß schliesslich mit den Programm den Wert zeigen, nicht durch ein Handrechnung) |
Jonny Leue (Irontears)
| Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 19:06: |
|
Hab die Lösung: (1) Als Variablentyp nur Word oder LongInt (nich Integer) verwenden! (2) Die Anzahl der Rekursionen vermindern: durch eine Abfrage statt erneuter Rekursion beim Spezialfall x=1 dann y+2 zurückliefern also: function ack(x,y: LongInt):LongInt; begin if x=0 then ack:=y+1 else if x=1 then ack:=y+2 else if y=0 then ack:=ack(x-1, 1) else ack:=ack(x-1, ack(x, y-1)); end; Danke für den Typ mit den zuvielen Rekursionen! Achso und ack(4,1)=65533 (wie oben schon gesagt) mfg Jonny |
SpockGeiger (Spockgeiger)
| Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 21:27: |
|
Hallo Jonny Es freut mich sehr, dass ich Dir weiterhelfen konnte. Ich schämte mich fast, Dir nur diesen mickrigen Hinweis zu geben, ohne eine Idee zu haben, wie man das Problem löst. Aber zum Glück konntest Du den Hinweis verwerten. Meinen Respekt! Übrigens ist bei der Berechnung rekursiver Funktionen meistens die Rekursionstiefe das Problem. Wenn man als Programmierer zum erstren mal die Fibonacci-Zahlen kennenlernt, muss man das auch schmerzlich erfahren. Vielleicht bekommt man dabei nicht so schnell einen Überlauf, jedenfalls dauert es aber schon bei rel. kleinen n Ewigkeiten. Der erste Versuch Fib(n)=if n=0 then 0 elif n=1 then 1 else Fib(n-1)+Fib(n-2) ist auf jeden Fall nicht der beste. viele Grüße SpockGeiger |
|