我一直在关注电子书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。
答案 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 返回我并退出该功能。