雄辩的Javascript-ch4-arraytoList-Recursion

雄辩的Javascript-ch4-arraytoList-Recursion,javascript,recursion,Javascript,Recursion,我用有说服力的Javascript阅读了所有与这个特定练习相关的解决方案,但没有任何东西能解决我的问题 你可以看到 我的问题是如何通过从开始到结束而不是从结束到开始的循环来编写程序 以下是我的解决方案: 函数数组列表(arr){ var条目={value:null,rest:null} 对于(变量i=0;i1){ //不使用第一个元素递归调用 entry.rest=arrayToList(arr.slice(1)); //否则,添加null }否则{ entry.rest=null; } 返回

我用有说服力的Javascript阅读了所有与这个特定练习相关的解决方案,但没有任何东西能解决我的问题

你可以看到

我的问题是如何通过从开始到结束而不是从结束到开始的循环来编写程序

以下是我的解决方案:

函数数组列表(arr){
var条目={value:null,rest:null}
对于(变量i=0;ilog(arraytolost([10,20])基于您与空数组的链接,函数返回null,并且在这个练习中似乎只传递未命名的数组,因此我不关心原始数组(在函数执行后将是emtpy)

函数数组列表(arr,curr=null){
开关(当前=arr.shift()){
未定义的情况:
返回空
打破
违约:
返回{value:curr,rest:arraytolost(arr)}
}
}
设arr=[10,20,30,0,50]
console.log(arrayToList(arr))

.as console wrapper{top:0;max height:none!important;}
基于与空数组的链接,函数返回null,并且在这个练习中似乎只传递未命名的数组,因此我不关心原始数组(在函数执行后将是emtpy)

函数数组列表(arr,curr=null){
开关(当前=arr.shift()){
未定义的情况:
返回空
打破
违约:
返回{value:curr,rest:arraytolost(arr)}
}
}
设arr=[10,20,30,0,50]
console.log(arrayToList(arr))

。作为控制台包装器{top:0;max height:none!important;}
您很接近了。您需要在递归调用中传递数组的其余部分,例如

//返回像{“value”:10,“rest”:{“value”:20,“rest”:null}这样的对象
函数arrayToList0(arr){
var条目={};
//检查arr中是否有任何成员
if(阵列长度){
//如果有,则添加值
entry.value=arr[0];
}
//如果有更多条目,请添加它们
如果(arr.length>1){
//不使用第一个元素递归调用
entry.rest=arrayToList(arr.slice(1));
//否则,添加null
}否则{
entry.rest=null;
}
返回条目;
}

日志(数组列表([1,2,3])你很接近了。您需要在递归调用中传递数组的其余部分,例如

//返回像{“value”:10,“rest”:{“value”:20,“rest”:null}这样的对象
函数arrayToList0(arr){
var条目={};
//检查arr中是否有任何成员
if(阵列长度){
//如果有,则添加值
entry.value=arr[0];
}
//如果有更多条目,请添加它们
如果(arr.length>1){
//不使用第一个元素递归调用
entry.rest=arrayToList(arr.slice(1));
//否则,添加null
}否则{
entry.rest=null;
}
返回条目;
}

日志(数组列表([1,2,3])
我认为这种方法是一种改进,因为空数组正确地返回具有属性
value
rest
的对象,数组中的错误值不会导致提前退出,并且数组不会通过传递给函数而发生变异。它使用简单的自顶向下递归来生成嵌套列表

函数arrayToList(数组,条目={value:null,rest:null}){
if(array.length==0){
返回条目
}
返回{
值:数组[0],
rest:arrayToList(array.slice(1),null)
}
}
console.log(arrayToList([])//空

console.log(arrayToList([10,0,20])//falsy
我认为这种方法是一种改进,因为空数组正确地返回具有属性
rest
的对象,数组中的falsy值不会导致提前退出,并且数组不会通过将其传递给函数而发生变异。它使用简单的自顶向下递归来生成嵌套列表

函数arrayToList(数组,条目={value:null,rest:null}){
if(array.length==0){
返回条目
}
返回{
值:数组[0],
rest:arrayToList(array.slice(1),null)
}
}
console.log(arrayToList([])//空
log(数组列表([10,0,20])//falsy
函数数组列表(数组){
var条目={value:null,rest:null};
对于(var i=0;i
函数数组列表(数组){
var条目={value:null,rest:null};
对于(var i=0;i
如果数组包含像
0
这样的错误值,则此操作将失败。它还会破坏传递给它的数组。你真是天才。我第一次遇到在if条件中赋值的代码。我不知道如何像你一样反复思考。我的想法总是像分配初始值,看看是否需要任何循环或条件检查,然后只有当相同的模式重复时,我才会考虑递归。但是你直接跳进去了。如何这样思考?使用处理0值的解决方案编辑。。。没有什么特别的,只是当我看到“重复嵌套结构”时,我认为递归是非常有用的。无论如何,我的解决方案有点粗鲁;)如果数组包含一个伪值,如
0
,则此操作将失败。它还会破坏传递给它的数组。你真是天才。我第一次遇到在if条件中赋值的代码。我不知道如何像你一样反复思考。我的想法总是像分配初始值,看看是否需要任何循环或条件检查,然后只有当相同的模式重复时,我才会考虑递归。但是你直接跳进去了。如何这样思考?使用处理0值的解决方案编辑。。。没有什么特别的,只是当我看到“重复嵌套结构”时,我认为递归是非常有用的。无论如何,我的解决方案有点粗鲁;)因为你使用的是循环,所以你不需要
function arrayToList(array) {
  var entry = { value: null, rest: null };

  for (var i = 0; i < array.length; i++) {

    entry = { value: array[i], rest: entry };
  }

  return entry;
}