Javascript中用于填充数组的递归函数?
我试图在递归函数中用值的范围填充数组,但是我看到在返回数组时发生了一件奇怪的事情,尽管数组有值,但当我在函数外部警告它时,它给了我未定义的值。不确定是我的代码问题还是任何行为 当我厌倦了使用SimpleFor循环时,同样的实现工作得很好 我不知道这个问题的题目是什么,请给我一个好题目 带递归Javascript中用于填充数组的递归函数?,javascript,recursion,Javascript,Recursion,我试图在递归函数中用值的范围填充数组,但是我看到在返回数组时发生了一件奇怪的事情,尽管数组有值,但当我在函数外部警告它时,它给了我未定义的值。不确定是我的代码问题还是任何行为 当我厌倦了使用SimpleFor循环时,同样的实现工作得很好 我不知道这个问题的题目是什么,请给我一个好题目 带递归 var arr = []; function fillArray(n,i){ if(arr.length !== n){ if(i===0) arr[i]
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));
var arr=[];
函数fillArray(开始、结束){
首先,对于(var i=start,j=0;i来说,这不是一个应该在JavaScript中递归实现的好例子,它是单变量的
结果在函数外部为未定义的原因是代码无法返回每个后续递归调用的结果。递归语句应如下所示:
return fillArray(n,++i);
否则,返回数组的最后一个调用的返回值将被倒数第二个调用忽略。看看您的示例:
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));
首先,我不会在函数外声明值,也不会使用递归(因为会污染闭包。但如果这样做并保持函数的原样,就不要期望在这里返回值(因为在函数外编辑变量)
函数填充数组(n,i,a){
a、 推(i);
返回a.length log(fillArray(10,0,[]))
您是否尝试过使用调试器调试它?返回时,我将console.log正确显示其功能,但在函数外部,它的未定义建议堆栈溢出,如果有人或堆栈溢出对该问题投了反对票,请给出原因。这将有助于下次人们提出问题。通常,如果该问题不正确,请投反对票pond所以,像这样的问题的规则现在显然是一个非常古老的问题,但出于好奇,你只是想用连续的数字填充一个数组吗?我发现这个答案对这个问题很有用,特别是我在这里使用的递归是避免循环…有没有办法在数组中插入相同的值集,比如没有循环的100 1?@Dust呃,你为什么要避免循环?JavaScript没有适当的尾部调用,所以像你这样的递归函数使用内存没有什么好的理由。循环没有什么错。我实际上想在一个循环中实现质数范围之间的显示。这样我的复杂性就不会是n*n。那么有什么方法可以做到吗?我想我可以使用循环填充数组,就像您在这里的一次对话中所说的:@Duster使用递归而不是迭代不一定会对解决方案的时间复杂性产生任何影响。递归只是迭代的另一种方式。
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);