Themenbereiche Themenbereiche Profile Hilfe/Anleitungen Help    
Recent Posts Last 1|3|7 Days Suche Suche Tree Tree View  

Ackermann-Funktion: Was ist ack(4,1)?...

ZahlReich - Mathematik Hausaufgabenhilfe » ---- Archiv: Universitäts-Niveau » Mathematik für Informatiker » Ackermann-Funktion: Was ist ack(4,1)? « Zurück Vor »

Autor Beitrag
Seitenanfangvoriger Beitragnächster BeitragSeitenende Link zu diesem Beitrag

Jonny Leue (Irontears)
Suche alle Beiträge dieser Person in dieser Hauptrubrik
Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 05:26:   Beitrag drucken

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*
Seitenanfangvoriger Beitragnächster BeitragSeitenende Link zu diesem Beitrag

Zaph (Zaph)
Suche alle Beiträge dieser Person in dieser Hauptrubrik
Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 07:24:   Beitrag drucken

f(4,1) = 65533 ?

Siehe hier
Seitenanfangvoriger Beitragnächster BeitragSeitenende Link zu diesem Beitrag

SpockGeiger (Spockgeiger)
Suche alle Beiträge dieser Person in dieser Hauptrubrik
Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 10:31:   Beitrag drucken

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
Seitenanfangvoriger Beitragnächster BeitragSeitenende Link zu diesem Beitrag

Jonny Leue (Irontears)
Suche alle Beiträge dieser Person in dieser Hauptrubrik
Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 12:48:   Beitrag drucken

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)
Seitenanfangvoriger Beitragnächster BeitragSeitenende Link zu diesem Beitrag

Jonny Leue (Irontears)
Suche alle Beiträge dieser Person in dieser Hauptrubrik
Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 19:06:   Beitrag drucken

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
Seitenanfangvoriger Beitragnächster BeitragSeitenende Link zu diesem Beitrag

SpockGeiger (Spockgeiger)
Suche alle Beiträge dieser Person in dieser Hauptrubrik
Veröffentlicht am Dienstag, den 30. Oktober, 2001 - 21:27:   Beitrag drucken

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

Beitrag verfassen
Das Senden ist in diesem Themengebiet nicht unterstützt. Kontaktieren Sie den Diskussions-Moderator für weitere Informationen.

ad

Administration Administration Abmelden Abmelden   Previous Page Previous Page Next Page Next Page