2016-03-22 3 views
0

Ich habe ein Array von Strings in Heaps Funktion eingefügt. Obwohl der function generate() den Ausgang console.log(permut); ordnungsgemäß druckt, gibt er keine Daten zurück.Meine Funktion gibt nichts zurück

Version 1 mit return arr

var arrStr = ['a', 'a', 'b']; 
    var generated = generate(arrStr, arrStr.length); 
    console.log(g2); 


    function generate(arr, n) { 
    if (n === 1) { 
     console.log(arr); 
     return arr; 
    } else { 
     for (var i = 0; i < n; i++) { 
     generate(arr, n - 1); 
     if (n % 2 === 0) { 
      swap(i, n-1, arr); 
     } else { 
      swap(0, n-1, arr); 
     } 
     } 
    } 
    } 

    function swap(a, b, ar) { 
    var temp = ar[b]; 
    ar[b] = ar[a]; 
    ar[a] = temp; 
    } 

Version 2 mit permut = permut.concat(arr);

var arrStr = ['a', 'a', 'b']; 
    var generated = []; 
    generate(arrStr, arrStr.length, generated); 
    console.log(generated); 


    function generate(arr, n, permut) { 
    if (n === 1) { 
     permut = permut.concat(arr); 
     //console.log(permut); 
    } else { 
     for (var i = 0; i < n; i++) { 
     generate(arr, n - 1, permut); 
     if (n % 2 === 0) { 
      swap(i, n-1, arr); 
     } else { 
      swap(0, n-1, arr); 
     } 
     } 
    } 
    } 

    function swap(a, b, ar) { 
    var temp = ar[b]; 
    ar[b] = ar[a]; 
    ar[a] = temp; 
    } 

Version 1 Rückkehr für variable generated und Version 2 gibt ein leeres Array undefiniert.

Ich habe versucht, eine Test-String 'asd' zurückzugeben, aber immer noch nichts bekommen.

+2

Sie rufen die Funktion rekursiv, aber was tun Sie mit dem Ergebnis des rekursiven Aufrufs ? Wo im "else" Pfad gibst du eigentlich irgendwas zurück? –

+0

Die Funktion funktioniert ordnungsgemäß. Im 'else'-Pfad wird das 'n' reduziert, bis es 'n === 1' ist, wo die problematische Rückkehr ausgeführt wird. – AchiPapakon

+1

Im Code, den Sie zeigen, haben Sie 'n! == 1' (d. H. Im' else'-Teil) keine 'return'-Anweisung. I.e. Die Funktion gibt nichts zurück. Wenn Sie einen Wert zurückgeben wollen, müssen Sie tatsächlich die Anweisung 'return' verwenden. 'if ... else' ist binär, indem * entweder * etwas tut (wenn die Bedingung wahr ist) oder * etwas anderes *. In Ihrer Funktion wird der Teil * etwas anderes * beim ersten Aufruf ausgeführt und gibt nichts zurück. Ich schlage vor, Sie durchlaufen den Code in einem Debugger. –

Antwort

0

Variablen, die innerhalb einer JavaScript-Funktion deklariert sind, werden für die Funktion LOCAL. Werfen Sie einen Blick auf Javascript Bereiche. Mit anderen Worten: Änderungen, die Sie an dem Funktionsparameter innerhalb der Funktion vornehmen, wirken sich nicht auf die Parametervariable außerhalb der Funktion aus.

Geben Sie einfach das generierte Objekt am Ende Ihres Algorithmus zurück.

Beispiel:

var n = 1; 
incrementByOne(n); 
console.log(n) //still 1 

function incrementByOne(number) { 
    number++; 
} 

Lösung ist das Ergebnis zurück und es mit einer Variable in:

var n = 1; 
n = incrementByOne(n); 
console.log(n) //now it's 2 

function incrementByOne(number) { 
    return number++; 
} 
+0

Ich denke, das habe ich in 'var generated = generate (arrStr, arrStr.length);' – AchiPapakon

+0

Was versuchen Sie mit dem Algorithmus? –