schildi: rekursion und array

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!

  1. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. 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...

      1. 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

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. 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...

          1. 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

            --
            -------------------
            ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
          2. 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

            1. 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