Eloquent Javascript - ch4 - arraytoList - Recursion

mbyulnm0  于 2023-04-19  发布在  Java
关注(0)|答案(5)|浏览(117)

我在Eloquent Javascript中查看了与此特定练习相关的所有解决方案,但没有任何解决方案可以解决我的问题。
你可以看到arrayToList function here
我的问题是如何通过从开始到结束而不是从结束到开始的循环来编写程序。
以下是我的解决方案:

function arrayToList(arr) {
  var entry = { value: null, rest: null}
  for (var i = 0; i < arr.length; i++) {
    if(entry.value == null) 
      entry.value = arr[i]
    else{ 
      entry.rest = arrayToList([arr[i]])
        }
  }
  return entry
}

console.log(arrayToList([10,20]));

一切都很顺利。

Input - console.log(arrayToList([10, 20]));
output - { value: 10, rest: { value: 20, rest: null } }

但下面的一个给出的问题

Input - console.log(arrayToList([10, 20, 30]));
Actual output - { value: 10, rest: { value: 30, rest: null } }

Expected output - { value: 10,
  rest: { value: 20, rest: { value: 30, rest: null } } }

我不知道如何递归调用,即使数组中有超过2个元素,它仍然能够创建列表结构

lzfw57am

lzfw57am1#

你需要在递归调用中传递数组的其余部分,例如。

// Return object like {"value": 10, "rest": {"value": 20, "rest": null}}

function arrayToList0(arr) {
  var entry = {};
  // Check if there are any members in arr
  if (arr.length) {
    // If there are, add the value
    entry.value = arr[0];
  }
  
  // If there are more entries, add them
  if (arr.length > 1) {
    // Call recursively without first element
    entry.rest = arrayToList(arr.slice(1));
    
  // Otherwise, add null
  } else {
    entry.rest = null;
  }
  return entry;
}

console.log(arrayToList([1,2,3]));

可以缩短为:

function arrayToList(arr) {
  var entry = arr.length? {value:arr[0]} : {};
  entry.rest = arr.length > 1? arrayToList(arr.slice(1)) : null;
  return entry;
}

你没有说如何处理稀疏数组,上面的要求是没有缺失元素的连续数组。对于稀疏数组,你最终会在结果中得到很多value: undefined

bis0qfac

bis0qfac2#

我相信这种方法是对this answer的改进,因为一个空数组正确地返回一个具有属性valuerest的对象,数组中的假值不会导致提前退出,并且数组不会通过传递给函数而发生变化。它使用简单的自顶向下递归来生成嵌套列表。

function arrayToList (array, entry = { value: null, rest: null }) {
  if (array.length === 0) {
    return entry
  }

  return {
    value: array[0],
    rest: arrayToList(array.slice(1), null)
  }
}

console.log(arrayToList([])) // empty
console.log(arrayToList([10, 0, 20])) // falsy
6ovsh4lw

6ovsh4lw3#

基于你的空数组的链接,函数返回null,似乎只有未命名的数组将在这个练习中传递,所以我不关心原始数组(将在函数执行后空)。

function arrayToList(arr, curr = null){
  switch(curr = arr.shift()){
    case undefined:
      return null
      break
    default:
      return {value: curr, rest: arrayToList(arr)}
  }
}

let arr = [10,20,30,0,50]
console.log(arrayToList(arr))
.as-console-wrapper{top: 0; max-height: none!important;}
f5emj3cl

f5emj3cl4#

这个问题不需要使用递归

function arrayToList(array) {
  var re = {rest: null};
  for (var i = 0, c = re; i < array.length; i++) {
    c = c.rest = {value: array[i], rest: null};
  }
  return re.rest;
}

如果你需要使用递归算法,下面是我推荐的解决方案。
使用索引参数,这将是更有效的比其他答案使用递归算法。
未创建新阵列,也未更改原始阵列。

function arrayToList(arr, i) {
  return (i = i || 0) < arr.length ? {value: arr[i], rest: arrayToList(arr,i+1)} : null;
}

如果你不喜欢这个额外的参数,可以将它 Package 在另一个函数中。可能看起来像这样:

function arrayToList(arr) {
  return (function inner(r, i) {
    return i < r.length ? {value: r[i], rest: inner(r,i+1)} : null;
  })(arr, 0);
}
iqih9akk

iqih9akk5#

function arrayToList(array) {
      var entry = { value: null, rest: null };
      
      for (var i = array.length - 1; i >= 0; i--) {
        
        entry = { value: array[i], rest: entry };
      }
      
      return entry;
}
console.log(arrayToList([10,20,30]));

相关问题