Javascript 当只有一个数值可能性时,递归函数返回未定义

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

下面的代码包含一个递归方法,该方法应始终返回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);
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、 谢谢你,谢谢你的帮助。