Javascript中的递归函数来填充数组?

时间:2014-12-02 13:33:55

标签: javascript recursion

我试图用递归函数中的值范围填充一个数组,但是我看到在返回数组时发生了一个奇怪的事情,尽管数组有值,当我在函数外警告它时它给我未定义。不确定它是我的代码问题还是任何行为。

相同的实现,当我厌倦了使用简单的for循环它工作正常。

我不知道这个问题的标题,请建议我一个好的。

JS Fiddle

使用递归

var arr = [];
function fillArray(n,i){
    if(arr.length !== n){
        if(i===0)
            arr[i] = i;
        else
            arr[i] = arr[i-1] + 1;
        fillArray(n,++i);
    }
    else{
         console.log(arr);
         return arr;
    }
}
console.log(fillArray(10,0));

使用For循环

var arr = [];

function fillArray(start,end){
    for(var i=start,j=0;i<=end;i++,j++){
        arr[j] = i;
    }
    return arr;
}

alert(fillArray(1,10));

3 个答案:

答案 0 :(得分:2)

function fillArray(n, i, a) {
  a.push(i);
  return a.length < n ? fillArray(n, ++i, a) : a;
}

console.log(fillArray(10, 0, []));

答案 1 :(得分:0)

首先,这不是一个应该在JavaScript中递归实现的好例子。这是单一的。

结果在函数外部undefined的原因是您的代码无法返回每个连续递归调用的结果。递归语句应如下所示:

    return fillArray(n,++i);

如果没有这个, 返回数组的最终调用将使倒数第二次调用忽略其返回值。

答案 2 :(得分:0)

看看你的例子:

var arr = [];
function fillArray(n,i){
    if(arr.length !== n){
        if(i===0)
            arr[i] = i;
        else
            arr[i] = arr[i-1] + 1;
        fillArray(n,++i); // ends without returning anything
    }
    else{
         console.log(arr);
         return arr; // return array
    }
}
console.log(fillArray(10,0));

首先,我不会在函数外部声明值,并且我不会对递归进行声明(因为你污染了你的闭包。但是如果你这样做并保持你的函数原样,不要期望值作为返回在这里(当你在它之外编辑变量时)。

var arr = [];
function fillArray(n,i){
    if(arr.length !== n){
        if(i===0)
            arr[i] = i;
        else
            arr[i] = arr[i-1] + 1;
        fillArray(n,++i);
    } // return not needed
}
fillArray(10,0);
console.log(arr);