Rekursiv

Irgendwelche Probleme mit XAMPP für Windows? Dann ist hier genau der richtige Ort um nachzufragen.

Rekursiv

Postby Kei » 14. September 2003 20:20

Hi Leutz,

Hier einmal eine beispielfunktion die mein problem beschreibt:


<?php
function recur($i) {
echo $i." ";
if($i < 204)
recur($i+1);
}
recur (0);
?>

Wenn ich diese funktion so laufen lasse dann krieg ich ne vernünftige ausgabe:

0 1 2 3 4 5 6 7 8 9 10 ...[]... 199 200 201 202 203 204

Wenn ich aber in der If-Abfrage aus der 204 eine 205 mache dann kommt folgende Fehlermeldung in einem Popup:

Apache.exe - Fehler in Anwendung
Die Ausnahme "unknown software exception" (0xc00000fd) ist in der Anwendung an der Stelle 0x78004be9 aufgetreten.

Hat einer vorschläge?

In meinem original Script hab ich das gleiche Problem. Nur das die Struktur etwas anders ist. Fakt ist das bei wenig Rekursionen alles gut läuft und - wie es scheint - bei langen aufrufen dann keine Vernünftige ausgabe mehr kommt.

Mein System: 1,7 PIV, 256 MBRAM, Win2k

Gruß Kei
Kei
 
Posts: 7
Joined: 25. August 2003 18:26

Postby HardySim » 14. September 2003 21:19

hmm, was bringt recure??

kann man so ne "aufzählung" nicht einfach auch ohne machen? also die if mit dem $i+1 lassen?
[url=http://www.hardysim.de]
Image[/url]
www.party-safari.net
User avatar
HardySim
 
Posts: 325
Joined: 19. June 2003 10:22
Location: Geisenheim

Postby Kei » 14. September 2003 23:20

Es geht mir nicht um die aufzählung. Mein Script enthält eine viel kompliziertere "rekursive" funkteion (funktion die sich selber aufruft - mit neuen werten).

Das Problem ist aber irgendwie das Apache dabei abschmiert...
Wie gesagt etwa 200 rekursionen schafft gehts ohne problema ber dann...
Kei
 
Posts: 7
Joined: 25. August 2003 18:26

Postby HardySim » 15. September 2003 06:32

*rekursion im wörterbuch nachschlag*
[url=http://www.hardysim.de]
Image[/url]
www.party-safari.net
User avatar
HardySim
 
Posts: 325
Joined: 19. June 2003 10:22
Location: Geisenheim

Postby Kei » 15. September 2003 13:14

Hi HardySim,

Hier mal nen Link zum Thema Rekursion :) Bezweifle das du was in einem Duden findest: http://www.fim.uni-linz.ac.at/lva/rus/R ... ursion.htm

Kannst du trotzdem mal das kleine Script laufenlassen? Vieleicht hängt es vom System ab. Danke dir.

Kei
Kei
 
Posts: 7
Joined: 25. August 2003 18:26

Re: Rekursiv

Postby nemesis » 15. September 2003 17:31

<?php
function recur($i) {
echo $i." ";
if($i < 204)
recur($i+1);
}
recur (0);
?>

Wenn ich diese funktion so laufen lasse dann krieg ich ne vernünftige ausgabe:

0 1 2 3 4 5 6 7 8 9 10 ...[]... 199 200 201 202 203 204

Wenn ich aber in der If-Abfrage aus der 204 eine 205 mache dann kommt folgende Fehlermeldung in einem Popup:


Habs mal kurz ausprobiert, also bis 207 macht der Apache mit, danach bricht er wie bei dir ab :/ beim aktuellen php 4.3.3
bei php 4.2.3 gehts nur bis 877.

System siehe unten, ist wohl mehr ein "netter" php bug
php.net listet recur auch nicht als einzelne Funktion auf....
Ubuntu 8.04 | SMP P3 1.4 GHz | 6 GByte RegECC | 74 GByte Seagate 15k5 system | 3Ware 9550SXU-4LP with 4x 500 GByte Seagate ES2 Raid 10 data | StoreCase DE400 | PX-230A | Intel Pro/1000MT Dual PCI-X
User avatar
nemesis
AF Moderator
 
Posts: 999
Joined: 29. December 2002 13:14
Location: Ingolstadt

Postby Kei » 15. September 2003 23:52

Hi :)

Kann es sein das es mit Windows oder der Windowsversion von Apache hängt oder liegt es vieleicht an der Windowsversion von PHP?

Ich hab auch hier gepostet aber wie es scheint kommen die bis etwa 14000.

http://www.php4-forum.de/forum.php3?nr= ... ere=inhalt

Wie es scheint haben die Leutz dort unter Linux getestet. Wurde der Bug irgendwo dokumentiert? Schließlich ist rekursives rechnen in PHP nicht exklusiv verboten oder teusche ich mich?

rekur ist auch keine "richtige" PHP-Funktion. Der name wurde halt einfach so gewählt.

Gruß Kei
Kei
 
Posts: 7
Joined: 25. August 2003 18:26

Postby nemesis » 16. September 2003 02:55

Das rekursive aufrufe Verboten sind glaube ich mal auch nicht, aber wie man in den anderen Posts rauslesen kann, ist es mehr ein Stack Problem von php.
Php an sich wurde damals nur als kleine Homepageerweiterung entwickelt/geboren, glaube kaum das wirklich jemand mathematische Beweise damit aufstellen will :)

Um eine Endlosschleife laufen zu lassen ist Perl wohl doch besser geeignet ;)
Ubuntu 8.04 | SMP P3 1.4 GHz | 6 GByte RegECC | 74 GByte Seagate 15k5 system | 3Ware 9550SXU-4LP with 4x 500 GByte Seagate ES2 Raid 10 data | StoreCase DE400 | PX-230A | Intel Pro/1000MT Dual PCI-X
User avatar
nemesis
AF Moderator
 
Posts: 999
Joined: 29. December 2002 13:14
Location: Ingolstadt

Postby Oswald » 16. September 2003 10:21

Hallo Kei und die anderen!

Also Rekursion ist natürlich nicht verboten und es ist eine ganz normale Art zu programmieren. Allerdings sind Rekursionen grundsätzlich sehr speicheraufwendig. Das heißt ein rekursiver Algorithmus brauch mehr oder sogar viel mehr Speicher als ein iterativer Algorithmus. (Iterativ ist quasi das "normale" Programmieren.)

Und beim Speicherverbrauch liegt auch in diesem Fall das Problem. Probier mal folgendes aus: In der php.ini folgenden Wert hochsetzen:

memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)

Auf zum Beispiel:

memory_limit = 80M ; Maximum amount of memory a script may consume (8MB)

Allerdings ist auch dann die Anzahl der Rekursionen begrentzt. Nur stoppt das Skript erst später.

Liebe Grüße,
Oswald
User avatar
Oswald
Apache Friends
 
Posts: 2718
Joined: 26. December 2002 19:51
Location: Berlin, Germany
Operating System: Linux

Postby Kei » 16. September 2003 18:46

Hi,
danke das war ein guter tip. Und mein Provider hat schon vorher "memory_limit=50M" eingestellt. Habs auch geendert aber in der phpinfo() gibts trotzdem kein eintrag....

Problem besteht weiterhin.

Klar man kann es auch anders Lösen aber rekursiv ist es am geschicktesten weil man so leichter die übersicht behält. Und ich weiß das die Rekursion nicht so lange dauert... auf jedenfall nicht "ewig".

Kei
Kei
 
Posts: 7
Joined: 25. August 2003 18:26

Postby Kei » 16. September 2003 19:31

Hi Leutz,

ich hab grad mein Script angeguckt und bei jedem Funktionsaufruf ne Variable hochgezählt und bin auf etwa 203 aufrufe gekommen :) Also knapp unter der "magischen" marke. Hab ich das script so gestartet das es automatisch MEHR als 204 rekursionen braucht ist wieder abgestürzt.

Das Script sieht etwa so aus:

<?php

function eins($x) {
if($x == 0) {
$random = random(0,2);
zwei($random);
} else if($x == 1) {
$random = random(0,2);
zwei($random);
} else {
zwei(2);
}
}

function zwei($x) {
$this->array[$x] = $x;
if(count($this->array < 102) {
$random = random(0,2);
eins($x);
}
}

zwei(0);
?>

Möchte sagen das das nicht das ursprüngliche Script ist sondern ein stark vereinfachtes script ist das zeigt wie meine STRUKTUR aussieht. Es sind also 2 funktionen die sich gegenseitig aufrufen. Und jede läuft gleichlang wie die andere.

Hmm werd wohl draus eine Funktion machen müssen ... *schmoll* :)

Kei
Kei
 
Posts: 7
Joined: 25. August 2003 18:26


Return to XAMPP für Windows

Who is online

Users browsing this forum: No registered users and 3 guests