我正在制作时间表,并想要分层活动'根据发生的重叠次数。
我已经找到了关于如何计算重叠间隔的堆栈溢出的几个答案,但在我的情况下,当重叠是间接的时,我希望计数增加。
我提出了以下递归方法:
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;
}
},
但现在我被卡住了。我认为这是我想要的,除了它只是向前计数。如果我想向后和向前检查,每个递归调用会不会一次又一次地测试相同的索引吗?
答案 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);
}