如何摆脱这种无限循环?

时间:2018-02-24 23:59:16

标签: recursion linked-list infinite-loop

我正在编写一个递归函数来查找链表中节点的索引。它看起来像这样:

function indexAt(node, collection, linkedList) {
 let index = 0;
 if (node === nodeAt(index, linkedList,collection)) {
  return index
 } else { 
  index ++
  return indexAt(node, collection, linkedList)
 }
}

它调用nodeAt函数,如下所示:

function nodeAt(index, linkedList, collection) {
  let node = collection[linkedList];
  for (let i=0; i < index; i++) {
    node = next(node, collection)
  }
  return node
 } 

当索引为0时,这可以正常工作,但是当它是其他任何东西时,它会递增索引,然后将其设置回0,进入无限循环。如何在不从根本上改变代码的情况下解决这个问题?

2 个答案:

答案 0 :(得分:0)

在函数开始时,您将索引重置为0.因此,每次重复时,它都会重置索引,从而导致无限循环。

一个简单的解决方法是在函数外声明索引变量。这将确保每次函数重复时都不会重置。

更好的解决方法是将索引作为参数传递给函数,以便它始终跟踪自己的索引。

答案 1 :(得分:0)

只需制作一个包含额外变量的助手:

function indexAt(node, collection, linkedList) {
    function indexAt(index, node, collection, linkedList) {
        if (node === nodeAt(index, linkedList, collection)) {
            return index
        } else {
            return indexAt(index + 1, node, collection, linkedList)
        }
    }
    return indexAt(0, node, collection, linkedList);
}

现在你从0 ... n开始计数,并在每次创建这个O(n ^ 2)时使nodeAt从头开始。一个更好的方法是帮助器具有当前节点,在collection[linkedList]初始化,并以next(currentNode)index + 1步进,直到node === currentNode。这将是一个O(n)解决方案。 indexAt除非是必需的,否则不需要递归。