为什么这个递归函数没有返回值

时间:2016-07-28 21:57:31

标签: javascript recursion

我一直在关注电子书Eloquent Javascript来学习javascript。在第4章中,使用递归函数访问列表的第n个值存在挑战。我已经写了一个递归函数来做到这一点,但即使我可以访问正确的值,我也无法以一些令人沮丧的理由返回它。

我不确定书中使用的列表的定义是否是通用的,所以我在这里是一个解释。基本上每个列表元素都包含一个值和下一个列表元素。它就像某种开始。这是一个例子。

list = {
    value: 1,
    rest: {
        value: 2,
        rest: {
            value 3,
            rest: null
        }
    }
}

所以这是我遇到问题的代码。

function arrayToList(array){
  var list = {rest:null};
  for(var i = array.length-1; i>=0;i--){
    list = {
      value:array[i],
      rest:list
    }
  }
  return list;
}

/*
function nth(list, element){
  for(var i = 0;i < element;i++){
    list = list.rest;
  }
  return list.value;
}
*/

function nth(list, index){
  console.log(index);
  if(index < 1){
    console.log("Success", list.value);
    return list.value;
  }
  else {
    console.log("Fail");
    list = list.rest;
    index--;
    //console.log(index);
    nth(list,index);
  }
}

console.log(nth(arrayToList([10, 20, 30]), 1));
// → 20

注释掉的第n个函数可以完成本书所需的功能,但它并不是递归的。还有一些额外的console.log()用于调试。正如您所看到的,当我记录成功&#34;和值,它将记录正确的值。但是,当我在之后立即返回相同的值时,它将返回undefined。

2 个答案:

答案 0 :(得分:3)

要使用递归,必须返回函数调用

return nth(list,index);

答案 1 :(得分:2)

您需要从递归中返回值...

function nth(list, index){
  console.log(index);
  if(index < 1){
    console.log("Success", list.value);
    return list.value;
  }
  else {
    console.log("Fail");
    list = list.rest;
    index--;
    return nth(list,index);
  }
}

这样想 -

初次调用失败,因此您递归 R1 并失败,然后递归 R2 并成功。

您正确地将值从 R2 返回到 R1 ,但您必须从 R1 返回并退出该功能。