递归返回检查数组[i + 1]和数组[i-1]

时间:2015-09-07 19:32:08

标签: javascript recursion

我正在制作时间表,并想要分层活动'根据发生的重叠次数。

我已经找到了关于如何计算重叠间隔的堆栈溢出的几个答案,但在我的情况下,当重叠是间接的时,我希望计数增加。

我提出了以下递归方法:

countOverlaps: function(i, allItems) {

    var currentItem = allItems[i];

    // Declare position variables
    var currentItemStart = this.getStartTimeMinutes(currentItem.timeStartString);
    var currentItemEnd = currentItemStart + currentItem.duration;

    var nextItemStart = (i < allItems.length - 1) ? this.getStartTimeMinutes(allItems[i + 1].timeStartString) : null;
    var nextItemEnd = (nextItemStart != null) ? nextItemStart + allItems[i + 1].duration : null;

    var prevItemStart = (i >= 1) ? this.getStartTimeMinutes(allItems[i - 1].timeStartString) : null;
    var prevItemEnd = (prevItemStart != null) ? prevItemStart + allItems[i - 1].duration : null;

    // The logic
    // If the next item is an overlap, test the next item

    // If the previous item is an overlap, test the previous item

    if (currentItemEnd > nextItemStart && currentItemStart < nextItemEnd && nextItemStart != null) {
        return 1 + this.countOverlaps((i + 1), allItems); // BUT how do I do the same for the previous one?
    } else {
        return 0;
    }

},

但现在我被卡住了。我认为这是我想要的,除了它只是向前计数。如果我想向后和向前检查,每个递归调用会不会一次又一次地测试相同的索引吗?

1 个答案:

答案 0 :(得分:1)

与所有递归一样,您只需要在函数中使用一个元素/项目。记住终止 - 这是递归中最重要的事情(不是它不是自我调用,因为没有它它根本不会是一个递归)。 之后,您将使用另一个修改过的参数给自己打电话。

因为我正确地理解你,你想要从某个地方开始,然后向左右移动。查看终止代码。你应该根据自己的需要改变条件。

开始sum left and sum right不是递归的一部分,因为你只想在每次递归时朝一个方向前进。

此代码很简单,因此您可以轻松地根据需要进行调整。

function sum(index, array){    
    function sumRecursion(index, array, direction){
        // the termination ;)
        if (index < 0) return 0;
        if (index > array.length) return 0;

        // do some stuff with your array at the current index.
        // sorry, I did'nt read your logic code
        var count = ...

        // now the recursion
        return count + sum(index + direction, array, direction);
    }
    return sumRecursion(index, array, -1) + sumRecursion(index, array, +1);
}