gpt4 book ai didi

javascript - 查找循环数组中任意两个索引之间的中间索引

转载 作者:行者123 更新时间:2023-12-03 07:44:40 26 4
gpt4 key购买 nike

我有一个数组和三个索引:

var arr = ['a', 'b', 'c', 'd'];
var f = 0; // first element
var l = arr.length - 1; // last element
var c = 0; // current element

我正在尝试编写一个函数,使索引c循环遍历数组。要求是它永远不会到达索引l。因此,每当 c 达到某个值时,fl 也需要增加。

作为 c 的限制的合理值我认为是 f 和 l 之间的中间点。我写的函数是这样的:

var mod = function(x, m) {
var r = x%m;
return r<0 ? r+m : r;
}

while (true) {
console.log('f', f, 'l', l, 'c', c);
if (c == l) {
console.log('error');
}

c = mod(c + 1, arr.length);

if (c > mod(l - f, arr.length) / 2) {
f = mod(f + 1, arr.length);
l = mod(l + 1, arr.length);
}
}

这显然不起作用。是否有一个很好的简单公式可以使用模运算符来获得我想要的结果,或者该方法是完全错误的?

这里有一个 fiddle 可以尝试:https://jsfiddle.net/wku37h9e/2/

编辑:解释一下这样做的目的会有点长。假设数组中存储了我必须不断移动的外部元素的位置。当c接近l时,我推进所有索引。以图形方式表示如下:

1. [f|c] [   ] [   ] [ l ]
2. [ f ] [ c ] [ ] [ l ]
3. [ l ] [ f ] [ c ] [ ] // here I start moving things around
4. [ ] [ l ] [ f ] [ c ]
5. [ c ] [ ] [ l ] [ f ]
6. [ f ] [ c ] [ ] [ l ]

等等。数组中的元素越多,索引之间的距离就会越大。

我还使用了与正常版本不同的 mod 来考虑负数。

我希望现在更清楚了

最佳答案

A reasonable value to work as a limit for c I thought would be the middle point between f and l

在 mod len 中求两个值 lowhigh 之间的平均值

function midPoint(low, high, len) {
var mid;
low %= len;
high %= len;
while (low < 0) low += len; // these two lines are the
while (high < low) high += len; // most important for direction
mid = (low + high) / 2; // mean average
mid %= len; // convert back to our mod
return mid;
}

所以有

// works as expected beyond range of mod
midPoint( 1, -1, 9); // middle of 1..8 (mod 9) = 4.5
midPoint(-7, 5, 9); // middle of 2..5 (mod 9) = 3.5
midPoint(-6, 12, 9); // middle of 3..3 (mod 9) = 3
// and
midPoint( 2, 5, 9); // middle of 2..5 (mod 9) = 3.5
midPoint( 5, 2, 9); // middle of 5..2 (mod 9) = 8 (we went the other way around)
<小时/>

在整个计算结束之前,您实际上不必强制执行 mod,因此,如果您确实想要,可以执行以下操作,但您在循环中失去了方向

function midPoint(A, B, len) {
var mid;
mid = (A + B) / 2; // mean average
mid %= len; // convert back to our mod
while (mid < 0) mid += len; // always positive
return mid;
}

但是请注意

midPoint(-6, 3, 9); // middle of 3..3 (mod 9) = 7.5
midPoint( 3, 3 + 0 * 9, 9); // middle of 3..3 (mod 9) = 3
midPoint( 3, 3 + 1 * 9, 9); // middle of 3..3 (mod 9) = 7.5
midPoint( 3, 3 + 2 * 9, 9); // middle of 3..3 (mod 9) = 3

3..3 (mod 9) 的中点既是 3 又是 7.5,即 true,但我们现在走哪条路取决于k(其中B - A = k * len + a)

关于javascript - 查找循环数组中任意两个索引之间的中间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35259167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com