Autor Beitrag
Mitmischer 1703
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Mi 08.12.10 21:11 
Hi DF!

Ich soll für die Schule einen Algorithmus programmieren, um Pi zu berechnen. Das funktioniert soweit auch wunderbar - nur gab's da ein Problemchen. Der Algorithmus ist rekursiv, also war ein Stackoverflow natürlich unumgänglich. Mit dem Stackoverflow an sich hab ich kein Problem - nur mit der Rekursionszahl bis zum Overflow.


  • Mein Algorithmus schafft bis zum Crash 12305 Rekursionen. Das ist meiner Meinung nach viel zu wenig, denn mein RAM lacht sich über seine Belastung kaputt. Das waren ca. 2 MB Belastung für 4 GB RAM...
  • Sobald ich in meiner rekursiven Funktion den Datentyp von Single auf Extended ändere, schafft der Algo nur noch 11235 Rekursionen.
  • Es sieht für mich so aus, als dass der Stack die RAM-Größe nicht voll ausnutzt.


Workaround

Da mir der Algo mit seinen 10000 Rekursionen viel zu schnell vorbei ist :mrgreen:, hab ich über zwei Workarounds nachgedacht, die meiner Meinung nach aber sehr unschön sind. Vielleicht habt ihr ja noch Ideen, was man zur Vermeidung von Stack-Overflows unternehmen kann ;)


  • Die Rekursion der Funktionen auf 500 begrenzen, mit for-Schleifen bis zur gewünschten Rekursionsteife vordringen.

  • Die Funktionen zu Prozeduren machen, das Ergebnis in eine Variable schreiben. Ich weiß nicht, ob das was bringt, probiere ich aber jetzt aus.


Was kann ich tun, um einen Stack-Overflow zu vermeiden oder wenigstens so lange herauszuzögern, bis ich eine Rekursionstiefe hab, die halbwegs vernünfig ist?
Was vermeidet einen Stack-Overflow eher und warum: Felder, lokale Variablen oder Funktionsvariablen?

Je weniger Variablen, desto mehr Rekursionen?

_________________
Die Lösung ist nicht siebzehn.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 08.12.10 21:14 
Moin!

Lokale Variablen landen mit auf dem Stack, so dass man hier möglichst wenige verwenden sollte. Du kannst aber auch einfach den Stack in den Programmoptionen erhöhen (das ist allerdings kein Allheilmittel für einen schlecht programmierten Algorithmus - ganz allgemein mal dazu gesagt :?). :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 08.12.10 21:56 
Bitte mit Soße ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 08.12.10 22:22 
Moin!

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Bitte mit Soße ;-)
Ähm, what? :gruebel:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Mi 08.12.10 22:28 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Moin!

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Bitte mit Soße ;-)
Ähm, what? :gruebel:

cu
Narses


Quellcode? ;)

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 08.12.10 22:30 
Statt der Rekursion kannst du deinen Algorithmus eventuell auch Iterativ machen...hmm, wie ging nochmal die Berechnung von Pi? xD

wikipedia hat folgendes geschrieben:

Der Chinese Chao Lu ist offizieller Weltrekordhalter mit bestätigten 67.890 Nachkommastellen, welche er am 20. November 2005 fehlerfrei in einer Zeit von 24 Stunden und 4 Minuten aufsagte.

:autsch:

Also ich finde jetzt auf die schnelle keinen rekursiven Quellcode...zeig mal deinen :D

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Mitmischer 1703 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Mi 08.12.10 22:32 
Ah. Sagt doch was :nut:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function TForm3.WallisProduct(AResult : Extended; ACounter, ABreakAt : Word) : Extended;
begin
  try
   if ACounter > ABreakAt then
    Exit(AResult*2);
   Result := AResult*
         ((ACounter*2/
         (ACounter*2-1))*
          (ACounter*2/
         (ACounter*2+1)));
   Inc(ACounter);
   FRecursions := ACounter;
   Result := WallisProduct(Result, ACounter, ABreakAt);
  except on EStackOverflow do
   Exit(AResult*2);
  end;
end;


Das erste Mal so aufgerufen:
ausblenden Delphi-Quelltext
1:
ShowMessage(FloatToStr(WallisProduct(11, Recursions)));					


Recursions gibt die Grenze an, ab der der Algo abbrechen soll.

Edit: FRecursions gibt mir an, wie viele Durchläufe der Algo geschafft hat. Hat also eine rein statistische Funktion.

_________________
Die Lösung ist nicht siebzehn.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 08.12.10 22:53 
So wie ich das sehe kannst du das prima Iterativ machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
function TForm3.WallisProduct(AResult : Extended; ACounter, ABreakAt : Word) : Extended;
begin
  //while Schleife außenrum
  while True do
  try
   if ACounter > ABreakAt then
    Exit(AResult*2);
   Result := AResult*
         ((ACounter*2/
         (ACounter*2-1))*
          (ACounter*2/
         (ACounter*2+1)));
   Inc(ACounter);
   FRecursions := ACounter;
   //Result := WallisProduct(Result, ACounter, ABreakAt);
   //stattdessen, Werte lokal anpassen:
   AResult:=Result;
   ACounter:=ACounter;
   ABreakAt:=ABreakAt;
  except on EStackOverflow do
   Exit(AResult*2);
  end;
  end;
end;


Ich hab den Code jetzt einfach mal durch ne while Schleife ergänzt und die Parameter gesetzt...da ist natürlich sinnloses dabei, das kannst du dann selbst rausnehmen :D Auch bräuchte die while Schleife ne Abbruchbedingung...

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)

Für diesen Beitrag haben gedankt: Mitmischer 1703
Mitmischer 1703 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Do 09.12.10 21:52 
cool, danke!

_________________
Die Lösung ist nicht siebzehn.