Language agnostic 计算数组中的上一个和下一个索引
我有一个基于1的数组,包含四个项目,需要遍历它们。对于数组中给定的索引,我需要计算出下一项的索引和上一项的索引。这听起来很简单,但数组需要环绕。因此,当您位于数组的开头时,前一项将被视为最后一项。同样,如果您位于数组的末尾,则下一项将被视为第一项 我意识到这可以通过使用条件语句来解决,但我想知道是否可以使用数学方程来解决。我有一个很适合下一个项目Language agnostic 计算数组中的上一个和下一个索引,language-agnostic,Language Agnostic,我有一个基于1的数组,包含四个项目,需要遍历它们。对于数组中给定的索引,我需要计算出下一项的索引和上一项的索引。这听起来很简单,但数组需要环绕。因此,当您位于数组的开头时,前一项将被视为最后一项。同样,如果您位于数组的末尾,则下一项将被视为第一项 我意识到这可以通过使用条件语句来解决,但我想知道是否可以使用数学方程来解决。我有一个很适合下一个项目 NextItem = Modulus(CurrentItem, 4) + 1 (模函数返回一个数除以另一个数的余数) 有人对我如何计算前一项有什么想
NextItem = Modulus(CurrentItem, 4) + 1
(模函数返回一个数除以另一个数的余数)
有人对我如何计算前一项有什么想法吗?由于模运算总是在基于0的范围内工作得更好,因此可以使用
CurrentItem-1
将其转换为其中一项
然后,对于模4,加3与减1是一样的,但具有从不变负的优点(一些模运算符可能不喜欢负数)
然后再次添加1以返回到基于1的数字
这使得:
PrevItem = Modulus(CurrentItem - 1 + 3, 4) + 1
或者,简化:
PrevItem = Modulus(CurrentItem + 2, 4) + 1
有两件事需要理解,第一,
module(-1,n)=n-1
,第二,module()
最适合基于0
的索引。将这两种方法结合起来可以:
NextItem = Modulus((CurrentItem-1)+1, NumberOfItems) + 1
PrevItem = Modulus((CurrentItem-1)-1, NumberOfItems) + 1
对于
NumberOfItems=4
,模(-2,4)=2
,它给出了Pax的答案,如果您的系统模()不支持负数,但不那么清晰,则可能是必要的。这可能取决于模相对于负值的属性,但在Lua中,以下功能有效:
for i = 1, 8 do
local idxF = i % 4 + 1
local idxB = (i - 2) % 4 + 1
print(i .. " " .. idxF .. " " .. idxB)
end
在您未指定的语言中,应该是
PreviousItem=modular(CurrentItem-2,4)+1
。这不是modular(CurrentItem+1,4)吗?不,NextItem的公式很好用。当CurrentItem为3时,模数(CurrentItem+1,4)失败。是的,数组是基于1的,当然,对不起。