首页 > 解决方案 > 递归函数无法读取对象属性

问题描述

我做了一个函数,将一个数组变成一个列表,如下所示:

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

然后我尝试创建一个递归函数,它接受一个列表和一个数字并返回列表中给定位置的元素

这是第一次尝试:

function arrayToList(array) {
  var result = null;
  for (var i = array.length; i >= 0; i--) {
    result = {
      value: array[i],
      rest: result
    }
  }
  return result
}
function nthRecur(list, index) {
  var counter = 0
  if (counter === index) {
    return list.value
  } else {
    counter++
    list = list.rest
    return nthRecur(list, index)
  }
}
console.log(nthRecur(arrayToList([10, 20, 30]), 1))

第二次尝试:

function arrayToList(array) {
  var result = null;
  for (var i = array.length; i >= 0; i--) {
    result = {
      value: array[i],
      rest: result
    }
  }
  return result
}
function nthRecur(list, index) {
  var counter = 0
  if (counter === index) {
    return list.value
  } else {
    list = list.rest
    return nthRecur(list, index - 1)
  }
}
console.log(nthRecur(arrayToList([10, 20, 30]), 1))

它刚刚奏效。我不知道为什么。有人可以解释吗?

标签: javascriptrecursionlinked-list

解决方案


您可以通过直接使用索引来缩短它。

function arrayToList(array) {
    var result = null,
        i = array.length;
    while (i--) {
        result = { value: array[i], rest: result };
    }
    return result;
}


function nthRecur(list, index) {
    return index
        ? nthRecur(list.rest, index - 1)
        : list.value;
}

var list = arrayToList([10, 20, 30]);
console.log(list);
console.log(nthRecur(list, 1));


推荐阅读