2016-08-04 7 views
0

Das Problem ist in der ListToArray-Funktion, ArrayToList nur dort, um einen Kontext zur Verfügung zu stellen, wie Listen erstellt werden.Warum funktioniert diese Rekursion nicht mit Javascript?

var arrayToList = function (array) { 
    var lastList = null; 
    for (i=array.length-1; i >= 0; i--) { 
     var list = {value : array[i], rest : lastList}; 
     lastList = list; 
    } 
    return lastList; 
} 

var list = arrayToList([1,2,3]) 

var listToArray = function (list) { 
    var array = []; 
    array.push(list.value); 
    if (list.rest != null) { 
     array.concat(listToArray(list.rest)); 
    } else { 
     return array; 
    } 
} 

var array = listToArray(list) 

> list 
{ value: 1, rest: { value: 2, rest: { value: 3, rest: null } } } 
> array 
undefined 
+1

Es gibt nur eine 'return' Anweisung in dem' else' Block, nicht im 'if' Block. – Xufox

+0

Ist das wirklich etwas, das nicht gelöst werden konnte, indem Sie Ihren Code im Debugger durchlaufen? –

Antwort

1

Paare von Fixes:

  • das Array zurück in array.concat
  • Jedes Mal, den Kontext ein neues arr = [] verliert die vorherigen verwendet werden. Entweder sollte es als Parameter übergeben werden oder in einem globalen Kontext gehalten werden.

Führen Sie das folgende Codefragment aus.

var arrayToList = function(array) { 
 
    var lastList = null; 
 
    for (i = array.length - 1; i >= 0; i--) { 
 
    var list = { 
 
     value: array[i], 
 
     rest: lastList 
 
    }; 
 
    lastList = list; 
 
    } 
 
    return lastList; 
 
} 
 

 
var list = arrayToList([1, 2, 3]) 
 

 
var listToArray = function(list, array) { 
 
    if (!array) { 
 
    array = []; 
 
    } 
 
    array.push(list.value); 
 
    if (list.rest != null) { 
 
    array.concat(listToArray(list.rest, array)); 
 
    } else { 
 
    return array; 
 
    } 
 
    // need to return the array which is used in array.concat 
 
    return array; 
 
} 
 
var array = listToArray(list); 
 
console.log(list); 
 
console.log(array);