当只有一个数值可能性时,递归函数返回undefined

时间:2015-06-16 18:33:10

标签: 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.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);

3 个答案:

答案 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

此外,这可能比递归算法快得多。