这是一个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);
}