rekursion und array
schildi
- javascript
hallo,
hab da mal was getestet, weil ich evtl. ein array in einer rekursion einsetzten wollte in einem algorithmus.
hier mal ein testcode:
function rek(i,arr)
{
if(!i) i="";
if(!arr) arr=new Array();
if(i.length<=5)
{
arr[arr.length] = i;
document.write(arr.length);
document.write("<br>");
document.write(i+"<br>");
i+="A";
rek(i,arr);
document.write(i+"<br>");
document.write(arr.length);
}
}
rek();
das wird dabei ausgegeben:
1
2
A
3
AA
4
AAA
5
AAAA
6
AAAAA
AAAAAA
6AAAAA
6AAAA
6AAA
6AA
6A
6
meine frage: wieso wird das array, wie es auch bei einer zählervariable oder dem string in diesem beispiel geschieht, anscheinend nicht auf den stack gelegt und dann wieder im filo verfahren wieder abgetragen?
würde mich interessieren, denn so könnte ich das array nicht verwenden in einer rekursion.
gruß an alle und danke für alle antworten!
Hi,
meine frage: wieso wird das array, wie es auch bei einer zählervariable oder dem string in diesem beispiel geschieht, anscheinend nicht auf den stack gelegt und dann wieder im filo verfahren wieder abgetragen?
Du entfernst nirgends Elemente aus dem Array. Warum sollten also Elemente aus dem Array verschwinden?
cu,
Andreas
Du entfernst nirgends Elemente aus dem Array. Warum sollten also Elemente aus dem Array verschwinden?
weil genau das geschehen sollte bei ner rekursion?
beim erneuten aufruf der funktion selbst wird ja jedesmal eine "kopie" der variablen auf einen stackspeicher gelegt. dieser stackspeicher wird dann stück für stück wieder abegetragen. siehst du ja beim i.
ich entferne ja auch bei i nix mehr...
Hi,
Du entfernst nirgends Elemente aus dem Array. Warum sollten also Elemente aus dem Array verschwinden?
weil genau das geschehen sollte bei ner rekursion?
Wie kommst Du darauf?
beim erneuten aufruf der funktion selbst wird ja jedesmal eine "kopie" der variablen auf einen stackspeicher gelegt.
Genau. Eine Kopie der Referenz auf das Array.
Aber NICHT eine Kopie des Array.
cu,
Andreas
Hi,
Genau. Eine Kopie der Referenz auf das Array.
Aber NICHT eine Kopie des Array.
soll das heissen ein array wird anders behandelt als ein string oder ein integer? also deine erklärung leuchtet mir nich ein...
Hi,
auf die Gefahr hin, jetzt _mein_ Unwissen zu entblößen, aber JAVA hantiert so ungerne mit wahren Objekten, dass da meistens Referenzen hin und her gehen. Wenn das in JavaScript auch nur annähernd so ist, dann sollten auch hier an die Funktionen in den allermeisten Fällen Referenzen übergeben werden.
Zumindest bei sämtlichen Formularen mit denen ich bisher gearbeitet habe war das auch so - Wie schlimm wäre es, wenn du
aendereFormat(document.formular.textfeld)
aufrufst, und dann anstelle einer Referenz auf das Feld eine Kopie des ganzen bekommst.
Musste ich mich anfangs auch bei JAVA dran gewöhnen, gab so den ein oder anderen Fehler, den ich länger gesucht habe. Muss man halt wissen.
MfG
Rouven
Hallo,
Genau. Eine Kopie der Referenz auf das Array.
Aber NICHT eine Kopie des Array.soll das heissen ein array wird anders behandelt als ein string oder ein integer?
Ein Array ist in JavaScript zunächst einmal kein Typ, sondern nur ein spezielles Objekt vom Typ Object.
Zudem gibt es zwei verschiedene Arten von String- und Number-Werten. Zum einen die primitive values und zum anderen die objects. var bla = "blub"; erzeugt ein primitive value. var bla = new String("blub"); erzeugt ein object. Ein Array ist immer vom Typ Object, also in dieser Hinsicht ein object.
Objects haben Identität (sind nur mit sich selbst identisch), primitive values haben keine, d.h. sie sind mit anderen primitive values desselben Typs und desselben Werts identisch.
Wenn man primitive values an eine Funktion übergibt oder einem anderen Objekt zuweist, werden sie immer kopiert. Wenn man objects an eine Funktion übergibt oder einem anderen Objekt zuweist, werden sie immer referenziert. Das heißt, du arbeitest in allen rekursiven Funktionsaufrufen ständig mit demselben Array.
Mathias
Ein Array ist in JavaScript zunächst einmal kein Typ, sondern nur ein spezielles Objekt vom Typ Object.
[...]
danke mathias. das erklärts. daran hatte ich überhaupt nicht gedacht...
gruß schildi