Javascript递归计数

时间:2016-12-26 16:47:36

标签: javascript object recursion

我申请了一项工作,我接受了这项任务。我不得不编写一个函数reversePrint(),它返回一个反转数组,其中包含来自传递对象的值。

这是对象

var someList = {
    value: 1,
    next: {
        value: 2,
        next: {
            value: 3,
            next: {
                value: 4,
                next: null
            }
        }
    }
};

我的尝试

function reversePrint(linkedList) {
  // empty array with the result
  var b = [];
  // while loop to check if current next is not null
  while ( linkedList.next !== null ) {
    // push current value into the array
    b.push(linkedList.value);
    // go one level deeper
    linkedList = linkedList.next;
  }
  // push the last value into the array
  b.push(linkedList.value);
  // return reversed array
  return b.reverse();
}

该功能有效,但我觉得有更好的方法可以做到这一点。我已经搜索了stackoverflow的javascript递归操作,但是找不到任何被认为是重复的东西。有没有更有效的方法来做到这一点?

6 个答案:

答案 0 :(得分:2)

您的代码没有根本错误,但您的直觉是正确的:递归解决方案似乎更好地匹配数据结构的递归性质,更简洁,也可以编写以避免相反。



var someList = {value: 1, next: {
    value: 2, next: {
        value: 3, next: {
            value: 4, next: null}}}};

function reversePrint(input) {
  return !input ? [] : reversePrint(input.next).concat(input.value); 
}

console.log(reversePrint(someList));




请注意,此解决方案不能进行尾部优化,如果输入可能非常深,则最好避免使用此解决方案。可以尾部优化的解决方案是:

function reversePrint(input) {
  return function inner(input) {
    return !input ? [] : [input.value].concat(inner(input.next));
  }(input).reverse();
}

当然,可以避免使用迭代解决方案进行反向,但是在每一步都要求在阵列的正面进行昂贵的非移位操作。另一方面,递归解决方案创建了多个逐渐增加长度的数组,这也不是很便宜。

答案 1 :(得分:1)

https://jsfiddle.net/zwzecvqf/2/

这里有一个递归函数。

function reversePrint (item) {
  var nextItem = item.next
  var items

  if (nextItem) {
        items = reversePrint(nextItem)
  } else {
        items = [];
  }  

  items.push(item.value)
  return  items
}

答案 2 :(得分:1)

使用递归你也可以这样做。



import wx.lib.colourdb as wb
col_str = 'South Shore Lily Rose 4 Drawer Chest in White Wash'
colr = wb.getColourList()
for x in col_str.split(" "):
    if(x.upper() in colr):
        print(x)




答案 3 :(得分:1)

又一种递归解决方案,但避免创建和丢弃多个中间数组:

function reversePrint(node, array) {
  // Fill in the array if not given
  array = array || [];
  // Recurse if appropriate
  if (node.next) {
    reversePrint(node.next, array);
  }
  // Add the value on the way out
  array.push(node.value);
  return array;
}

function reversePrint(node, array) {
  array = array || [];
  if (node.next) {
    reversePrint(node.next, array);
  }
  array.push(node.value);
  return array;
}
var someList = {
    value: 1,
    next: {
        value: 2,
        next: {
            value: 3,
            next: {
                value: 4,
                next: null
            }
        }
    }
};
console.log(reversePrint(someList));

答案 4 :(得分:0)

不使用递归怎么样?我没有找到这个没有被禁止的信息。

var someList = {
    value: 1,
    next: {
        value: 2,
        next: {
            value: 3,
            next: {
                value: 4,
                next: null
            }
        }
    }
};

function reversePrint()
{
    var currentNode = someList;
    var cacheList = [];
    do
    {
        cacheList.push(currentNode.value);
        currentNode = currentNode.next;
    }
    while(currentNode != null);

    cacheList.reverse();  
    return cacheList;
}

var reverseList = reversePrint(); // [4,3,2,1]

答案 5 :(得分:0)

这里使用递归函数对子对象值

function reversePrint(linkedList) {
  // empty array with the result
  var b = [];

  function addValues(subList){
     if(linkedList.next)
        addValues(linkedList.next);

    b.push(item.value);
  }

  addValues(linkedList);
  return b.revers();  
}