Kio*_*ong 1 javascript recursion
我从一开始就经历了Javascript.没有捷径,没有框架,没有.只是简单的Javascript.只是为了它的乐趣,我正在做每一个运动.现在,当我谈到这个问题:
编写一个函数arrayToList来构建一个类似的数据结构
var list = {
value: 1,
rest: {
value: 2,
rest: {
value: 3,
rest: null
}
}
};
Run Code Online (Sandbox Code Playgroud)
我的代码必须能够满足以下条件:
console.log(arrayToList([10, 20]));
// ? {value: 10, rest: {value: 20, rest: null}} <== expected output which I am sure you know
Run Code Online (Sandbox Code Playgroud)
我试图递归地执行此操作,因为后面的问题要求我们递归地执行此操作(递归是我最薄弱的一点!).但是,我得到了以下代码:
var list =
{
value: 0,
rest: null
}
function arrayToList(array)
{
list.value = array.shift();
if(array.length!=0)
{
list.rest = arrayToList(array);
}
else
{
list.rest = null;
console.log(list); //this outputs to {value: 20, rest: null}
return list;
}
return list;
};
Run Code Online (Sandbox Code Playgroud)
但是,输出
{value: 20, rest: {value: 20, rest: {
value: 20
rest: {value: 20, rest: {value: 20, …}}
}}}
Run Code Online (Sandbox Code Playgroud)
......指的是同一块
{值:20,休息:{值:20,休息:{...}}
好吧,我没有扩展到最后看(它太长了!(开放后大约20次仍然是相同的)如果有一个结束的话).
希望有人指导我的答案.我已经花了几天时间在这上面并且卡住了.
非常感谢,祝大家度过愉快的一天!
您不需要list像目前正在使用的全局变量(除非您尝试进行一些复杂的优化 - 现在不要担心它).实际上,看起来这个全局list变量正是导致问题的原因.我将尝试从一开始就引导您完成正确的方法.
首先,尝试确定输出的"重复"部分需要的样子.在您的情况下,重复的部分是:
{
value: someValue,
rest: RECURSION
}
Run Code Online (Sandbox Code Playgroud)
因为如果您交换RECURSION上面的SAME结构,您将获得所需的确切级联效果:
{
value: someValue,
rest: {
value: someValue,
rest: RECURSION
}
}
Run Code Online (Sandbox Code Playgroud)
等等.
一旦确定了这一点,您的函数就需要返回该对象.就这么简单.交换someValue该前端值(即返回值arr.shift()),并将RECURSION调用交换回函数,并将其传递给数组的其余部分.这使:
function arrayToList(arr) {
var value = arr.shift();
return {
value: value,
rest: arrayToList(arr) // arr has already had its front value removed, by .shift()
};
}
Run Code Online (Sandbox Code Playgroud)
剩下要添加的唯一内容是结束条件,因此如果没有剩余值,则递归仅返回null(否则我们将永远循环):
function arrayToList(arr) {
if (arr.length === 0) {
return null;
}
var value = arr.shift();
return {
value: value,
rest: arrayToList(arr)
};
}
console.log(arrayToList([10, 20])); // {value: 10, rest: {value: 20, rest: null}}Run Code Online (Sandbox Code Playgroud)
而已!那有意义吗?