Javascript 当只有一个数值可能性时,递归函数返回未定义
下面的代码包含一个递归方法,该方法应始终返回7,但每当它必须重新生成一个数字时,它将返回undefined,因为生成的数字已包含在代码顶部定义的数组中 我的问题是。。。为什么会发生这种情况?我如何修复它Javascript 当只有一个数值可能性时,递归函数返回未定义,javascript,recursion,Javascript,Recursion,下面的代码包含一个递归方法,该方法应始终返回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.lengt
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);
var id=[1,2,3,4,5,6];
函数generatePlayerId(){
var检查=假;
var tempId=Math.floor(Math.random()*7)+1;
对于递归情况下的(var i=0;i,您还需要返回。这将使基本情况能够返回通过之前所有递归调用生成的值
试试这个:
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);
var id=[1,2,3,4,5,6];
函数generatePlayerId(){
var检查=假;
var tempId=Math.floor(Math.random()*7)+1;
对于递归情况下的(var i=0;i,您还需要返回。这将使基本情况能够返回通过之前所有递归调用生成的值
试试这个:
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);
var id=[1,2,3,4,5,6];
函数generatePlayerId(){
var检查=假;
var tempId=Math.floor(Math.random()*7)+1;
对于(var i=0;i
为什么会这样
在该if(check)
分支中,没有任何内容return
ed,因此您将返回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);
只需返回递归调用的结果:
…
console.log(tempId);
if (check)
return generatePlayerId();
//^^^^^^
else
return tempId;
为什么会这样
在该if(check)
分支中,没有任何内容return
ed,因此您将返回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);
只需返回递归调用的结果:
…
console.log(tempId);
if (check)
return generatePlayerId();
//^^^^^^
else
return tempId;
正如其他人所指出的,问题在于您需要返回递归调用的结果,而不仅仅是进行递归调用
然而,这种方法存在一个主要问题:堆栈溢出的可能性不是零,因为递归没有限制。最好将其转换为迭代算法(出于同样的原因,它可能会运行任意时间,但至少不会在运行时占用越来越多的内存)。您也不需要编写自己的代码来搜索数组;请使用。类似的操作应该可以:
function generatePlayerId(){
var tempId;
do{
tempId = Math.floor(Math.random()*7)+1;
} while (id.indexOf(tempId) !== -1);
return tempId;
}
而且,这可能比递归算法快得多。正如其他人所指出的,问题是您需要返回递归调用的结果,而不仅仅是进行递归调用
然而,这种方法存在一个主要问题:堆栈溢出的可能性不是零,因为递归没有限制。最好将其转换为迭代算法(出于同样的原因,它可能会运行任意时间,但至少不会在运行时占用越来越多的内存)。您也不需要编写自己的代码来搜索数组;请使用。类似的操作应该可以:
function generatePlayerId(){
var tempId;
do{
tempId = Math.floor(Math.random()*7)+1;
} while (id.indexOf(tempId) !== -1);
return tempId;
}
此外,这可能比递归算法快得多。有什么原因不能只获取数组中的最后一项并增加它吗?@Jesse kernaghan我可以,只是数组不一定需要按升序排列。”…应该总是返回7”-那你为什么要做一些随机的事情呢?除了其他人已经评论/回答的内容之外:如果你传递使用过的ID而不是使用全局变量,那么你的函数将更具重用性。@Christopherl你可以先对数组排序,还是说你不需要y从集合中寻找下一个最高点?递归地尝试命中一个随机数,然后循环一个数组,看看它是否存在,至少可以说,这似乎过于复杂了,但也许我遗漏了问题的一个关键部分。你有什么理由不能只得到数组中的最后一项并将其递增吗?@Jesse kernaghan我可以,除了array不一定需要按升序排列。“…应始终返回7”-那你为什么要做一些随机的事情呢?除了其他人已经评论/回答的内容之外:如果你传递使用过的ID而不是使用全局变量,那么你的函数将更具重用性。@Christopherl你可以先对数组排序,还是说你不需要在集合中寻找下一个最高点?递归地尝试命中一个随机数,然后循环一个数组,看看它是否存在,至少可以说是过于复杂了,但也许我遗漏了问题的一个关键部分。非常感谢。这完全有意义。非常感谢。这完全有意义。谢谢。我感谢你的帮助p、 谢谢你,谢谢你的帮助。