在两个方向循环
Posted
技术标签:
【中文标题】在两个方向循环【英文标题】:looping in two directions 【发布时间】:2011-03-10 12:51:47 【问题描述】:嘿,我正在寻找这个问题的干净解决方案:
我在第二个循环步骤中以i = 0
开始循环,然后是i = 1
,然后是i = -1
,然后是i = 2
等。
如何以干净的方式使用for
循环对其进行编程?
【问题讨论】:
既然您要求具体的实现,那么您使用的是什么语言? 【参考方案1】:如果你不介意让内循环出现 3 次:
f(0);
for (var i = 1; i <= 3; ++ i)
f(i);
f(-i);
2 次 if
:
for (var i = 0; i <= 3; ++ i)
f(i);
if (i > 0)
f(-i);
单次但表情难看:
for (var j = 1; j <= 7; ++ j)
var i = j / 2;
if (j % 2) i = -i;
f(i);
【讨论】:
@antpaw whhhhyyyyyyyyy?除了最丑之外,它在处理方面也是最复杂和低效的。 +1。另一种可能的解决方案,如果我们没有随机访问但只能双向访问链表,甚至可能需要这样做,例如,使用两个迭代器(一个递减,另一个递增,并访问第一个元素开始)。 您甚至可以将其“改进”为j/2 * -((j%2) * 2 - 1)
【参考方案2】:
f(0); //do stuff with 0
for(var i = 1; i<len; i++) //where len = positive boundary
f(i); //do stuff with i
f(-i); //do stuff with -i
应该做你想做的事
【讨论】:
+1 形式优雅;您可能必须将 do_stuff 提取到单独的函数中以避免代码重复,否则它非常漂亮。 这不是有效的 javascript 或 php。var
,不是int
。【参考方案3】:
每个循环,您似乎都在添加n*(-1)^(n+1)
,其中 n 是您当前正在执行的步骤,从 1 开始,从 i=0 开始。
initialize i = 0
n=0, i+=0*(-1)^1 # 0
n=1, i+=1*(-1)^2 # 1
n=2, i+=2*(-1)^3 # -1
n=3, i+=3*(-1)^4 # 2
等等
从这里开始,这取决于您希望使用哪种语言编写。从n = 0
迭代到您要停止的任何地方。
edit 这是一个糟糕的答案。但是很有趣=D
(我添加了最后一点,因为我一进行编辑,就有人对我投了反对票 =( )
【讨论】:
【参考方案4】:这是javascript中的实现
for ( var i = 0; Math.abs(i)<10; i=(i<=0?Math.abs(i)+1:-i))
console.debug(i)
希望对你有帮助。
【讨论】:
通过i=0;i<10;i=(i<=0>1-i:-i)
减少对数学的依赖【参考方案5】:
for (int i = 0; i < 10; i++)
int div = i / 2;
int mod = i % 2;
int offset = mod == 0 ? div : -div;
【讨论】:
【参考方案6】:我使用了正弦函数:
for ($i = 0; $i < 10; $i++)
echo round(0.5 * $i * sin((0.5 + $i) * M_PI))."\n";
【讨论】:
【参考方案7】:对落弹解决方案的修改,将在没有特殊条件的情况下处理 0 索引情况。
//do stuff with 0
for(int i = 0; i< (arrayLength/2); i++)
//do stuff with i
if(-i != i)
//do stuff with negIndex
【讨论】:
【参考方案8】:这个循环有一个模式。在数轴上查看它 - 它就像:
后退0步 向前迈出一步 向后退两步 向前迈出 3 步 后退 4 步这是一种解决方案 - 在循环的每次迭代中不断增加步长,并且每次都翻转方向(向前/向后)。继续添加到当前值。
// n is the number of elements to generate
for(var i = 0, value = 0, dir = -1; i < n; i++)
value = value + (dir * i);
console.log(value);
dir = dir * -1; // reverse direction
在 JavaScript 1.7 中使用 generators 的另一种解决方案与 @FallingBullet 的 solution 相同,但更美观:)
function sequence()
var i = 0;
yield i;
while(true)
i++;
yield i;
yield -i;
var seq = sequence();
seq.next(); // 0
seq.next(); // 1
seq.next(); // -1
seq.next(); // 2
...
【讨论】:
【参考方案9】:在 C 中。N 的值是您希望产生的序列中值的总数。
int i, n = 0, m = 1;
for (i = 1; i < N; i++, m = -m)
/* n is the next in the sequence */
n += m * i;
【讨论】:
【参考方案10】:一加一减一负:
for(int i=0, d=1, f=-1; i<10; i+=d, d=f-d, f=-f)
printf("%d\n", i);
生成一个内部循环:
push esi
push offset string "%d\n" (0D20F4h)
call dword ptr [__imp__printf (0D20A4h)]
mov eax,ebx
add esi,edi
sub eax,edi
add esp,8
neg ebx
mov edi,eax
cmp esi,0Ah
jl wmain+10h (0D1010h)
【讨论】:
【参考方案11】:对于它的价值,这是我自己对问题的解释。
for (var i = 0; i > -8; i = (i<=0) - i) // arbitrary condition stops loop at -8
【讨论】:
【参考方案12】:我可能会选择:
for (var i = 0; i <= max; i = ( i <= 0 ) ? -i + 1 : -i)
f( i );
【讨论】:
以上是关于在两个方向循环的主要内容,如果未能解决你的问题,请参考以下文章