使用递归函数查找链表中对象的值属性



这是一个JavaScript练习。

假设我有一个链表对象,如下所示:

var list = {value: 10, rest: {value: 20, rest: {value: 30, rest: null}}}

我需要编写一个递归方法来查找某个子列表对象的值。

例如,方法"第n个":

console.log(nth(list, 1));

应返回值20。

如果我先将其更改为数组,这很容易实现。

但是,我不能将其更改为数组,方法"nth"必须是递归的。

如果我的方法最终必须返回value属性,我如何使它递归到下一个子列表?这个方法不是必须返回下一个链表才能到达我想要的对象吗?

这个问题给出了一个提示:

类似地,第n个递归版本将查看列表"尾部"的一个越来越小的部分,同时对索引进行倒计数,直到它达到零,此时它可以返回它正在查看的节点的value属性。要获取列表的第零个元素,只需获取其头部节点的value特性。要获得元素N+1,请获取该列表的rest属性中的列表的第N个元素。

试试看:

var list = {value: 10, rest: {value: 20, rest: {value: 30, rest: null}}};
var  i  = 0
recurs = function(obj,x){
if(x===i){
return obj.value
}else{
i++;
return recurs(obj.rest,x);
}
};
console.log(recurs(list,1));
var list = {value: 10, rest: {value: 20, rest: {value: 30, rest: null}}};

recurs = function(obj,x,i = 0 ){
if(x===i){
return obj.value
}else{
i++;
return recurs(obj.rest,x,i); 
}
};
console.log(recurs(list,1));

这里有一种方法可以实现

const listRef = ( i , xs ) =>
xs === null
? undefined
: i === 0
? xs.value
: listRef ( i - 1 , xs.rest )
const myList =
{ value : 10
, rest : { value: 20
, rest : { value : 30
, rest : null
}
}
}
console.log ( listRef ( 0 , myList ) ) // 10
console.log ( listRef ( 1 , myList ) ) // 20
console.log ( listRef ( 2 , myList ) ) // 30
console.log ( listRef ( 3 , myList ) ) // undefined

但您需要在这里做出决定——当调用listRef ( 0 , [ undefined ] )时,您应该得到什么样的结果?这与listRef ( 0 , [] )有何不同?

listRef ( 0 , [] )可能与head ( [] )具有相同的行为,但我将由决定

认为递归解决这个方法的关键是调用父方法,直到输入参数变成一个

nth(list, index) {
if(list == null) return -1;
if(index == 0) return list.value;
nth(list.rest, index-1);
}

最新更新