假设你想循环from i=0 to i=n and j=0 to j=m
和m!=n
。是否可以将以下两个循环缩短为一个?
for(int i=0; i<=n; i++){}
for(int j=0; j<=m; j++){}
为了某事
for(int i=0,j=0; i<=n, j<=m; i++, j++){}
本质上,我希望循环说“将i和j都增加一个,如果i = n停止增加i,但是如果m> n则继续增加j”,或者如果if相反n>m
。
看起来微不足道或愚蠢,但我很好奇。
天真的,我们想做类似的事情:
for(int i = 0, j = 0; i <= n || j <= m; i = Math.min(n, i+1), j = Math.min(m, j+1))
......但是这不会终止,因为最大值i
是n
和最大值j
是m
,和其中的一个将永远是正确的。
如果您愿意让(for n < m
)i
在结束,那么问题就简单得多了n+1
,我们可以这样写:
for(int i = 0, j = 0; i <= n || j <= m; i = Math.min(n+1, i+1), j = Math.min(m+1, j+1))
仅当您想要在完成递增时保留(for n < m
)i = n
时,这才很复杂j
。复杂性被隔离,以使循环在正确的时间终止,同时仍然允许j
完成递增。
为了使循环终止,我们希望将较大的数字增加一个最大值,以使其超过最大值,从而达到终止条件。既然我们至少知道i <= n
并且j <= m
永远是真实的,那么让我们集中精力使它们始终都是真实的,并将终止条件更改为
i <= n && j <= m
在这种情况下n < m
,i
会在之前完成递增j
,因此我们需要让其j
超出有效最大值后再递增一个,以便违反i <= n && j <= m
。保持类似的条件n > m
,但相反,我们需要i
过去一个n
。
但是请注意,如果使用n == m
,我们可以安全地将两个值都超过各自的限制,并且终止条件将同时达到。下面手柄环路任何正输入n
或m
和终止给定正确的conditons,同时允许中的较小n
或m
成为各个迭代器的最大值。
for(int i = 0, j = 0, nadj = n + (n >= m ? 1 : 0), madj = m + (m >= n ? 1 : 0)
i <= n && j <= m;
i = Math.min(nadj, i+1), j = Math.min(madj, j+1))
值得注意的是,我们在第一部分中进行计算nadj
,madj
以避免在每次迭代期间重新计算它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句