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