下面的代码包含一个递归方法,该方法应始终返回7,但是每当必须重新生成数字时它返回undefined,因为生成的数字已经包含在代码顶部定义的数组中。
我的问题是......为什么会发生这种情况,我该如何解决?
var id = [1,2,3,4,5,6];
function generatePlayerId(){
var check = false;
var tempId = Math.floor(Math.random()*7)+1;
for(var i=0;i<id.length;i++){
if(tempId == id[i]){
check = true;
}
}
if(check){
console.log(tempId);
generatePlayerId();
}else{
console.log(tempId);
return tempId;
}
}
var num = generatePlayerId();
console.log(num);
答案 0 :(得分:3)
在递归的情况下,你也想要返回。这将使基本案例能够返回通过之前的所有递归调用生成的值。
试试这个:
var id = [1,2,3,4,5,6];
function generatePlayerId(){
var check = false;
var tempId = Math.floor(Math.random()*7)+1;
for(var i=0;i<id.length;i++){
if(tempId == id[i]){
check = true;
}
}
if(check){
console.log(tempId);
return generatePlayerId();
}else{
console.log(tempId);
return tempId;
}
}
var num = generatePlayerId();
console.log(num);
答案 1 :(得分:2)
该为什么会发生这种情况
if (check)
分支中的没有return
编辑,因此您将返回undefined
。
我该如何解决?
只返回递归调用的结果:
…
console.log(tempId);
if (check)
return generatePlayerId();
//^^^^^^
else
return tempId;
答案 2 :(得分:2)
正如其他人所指出的那样,问题是您需要返回递归调用的结果,而不仅仅是进行递归调用。
这种方法存在一个主要问题:堆栈溢出的可能性非零,因为递归没有限制。将此转换为迭代算法(由于相同的原因,可能会运行任意时间量,但在运行时至少不会吞噬越来越多的内存)会好得多。您也不需要编写自己的代码来搜索数组;使用indexOf()。这样的事情应该有效:
-1
此外,这可能比递归算法快得多。