确定循环中的迭代次数 (Java)
Determining Number of Iterations in a loop (Java)
我想知道是否有人知道有一个公式可以预先计算循环中的迭代次数。
我试了一下,得到了等式:
迭代次数等于((终值与初值之差的绝对值)加上(increment/decrement的绝对值))除以增量的绝对值/ 递减
或
expected = (int)((Math.abs(final-initial) + Math.abs(iteration)) / iteration),
例如:
for(int i = 43; i > 9; i-=8) ,将 运行 5 次,因为 43-10 (如果不包括,则在初始值上加一个) = 33+8 = 41/8 ~ 5
如果它等于或大于- for(int i = 43; I >= 9; i-=8), 那么你会根据 (43-9+8) / 8 (5)我的公式
我已经测试了几次,但还不确定。
谢谢。
排除循环的任何特殊中断(中断、改变计数器等),您可以测试下面的公式。如果终止测试是 <
而不是 <=
你应该从开始减去 1。
total iterations = (end - start + incr)/incr; // for <=
total iterations = (end - start + incr - 1)/incr; // for <
Random r = new Random();
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + start+1;
int incr = r.nextInt(50)+1;
for (int i = start; i <= end; i += incr) {
count++;
}
int calc = (end - start + incr - 1)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
排除循环的任何特殊中断(中断、改变计数器等),公式如下:
iterations = (end - start+incr)/incr,其中关系运算符为 >= 或 <=
如果关系运算符是 < 或 >,则迭代次数 = (end - start+incr-1)/incr
这个可以测试如下
/*
* Baring any special disruption of the loop (breaks, altering counter, etc), the formula is as follows:
iterations = (|start-end|+|incr|)/|incr|, where relational operator is >= or <=
- if relational operator is < or >, then iterations = ((|start-end|+|incr|-1)/|incr|
* @author rahul.arora, WJS
*/
import java.util.Random;
public class LoopIterationCalcTester {
public static void main(String[] args) {
for (int x = 0; x < 100; x++) {
Random r = new Random();
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + 20;
int incr = r.nextInt(50)+1;
for (int i = start; i < end; i += incr) {
count++;
}
int calc = (end - start-1+incr)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + 20;
int incr = r.nextInt(50)+1;
for (int i = start; i <= end; i += incr) {
count++;
}
int calc = (end - start+incr)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + 20;
int incr = r.nextInt(50)+1;
for (int i = end; i >= start; i -= incr) {
count++;
}
int calc = (end - start+incr)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + 20;
int incr = r.nextInt(50)+1;
for (int i = end; i > start; i -= incr) {
count++;
}
int calc = (end - start-1+incr)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
}
}
}
我想知道是否有人知道有一个公式可以预先计算循环中的迭代次数。
我试了一下,得到了等式:
迭代次数等于((终值与初值之差的绝对值)加上(increment/decrement的绝对值))除以增量的绝对值/ 递减
或
expected = (int)((Math.abs(final-initial) + Math.abs(iteration)) / iteration),
例如:
for(int i = 43; i > 9; i-=8) ,将 运行 5 次,因为 43-10 (如果不包括,则在初始值上加一个) = 33+8 = 41/8 ~ 5
如果它等于或大于- for(int i = 43; I >= 9; i-=8), 那么你会根据 (43-9+8) / 8 (5)我的公式
我已经测试了几次,但还不确定。
谢谢。
排除循环的任何特殊中断(中断、改变计数器等),您可以测试下面的公式。如果终止测试是 <
而不是 <=
你应该从开始减去 1。
total iterations = (end - start + incr)/incr; // for <=
total iterations = (end - start + incr - 1)/incr; // for <
Random r = new Random();
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + start+1;
int incr = r.nextInt(50)+1;
for (int i = start; i <= end; i += incr) {
count++;
}
int calc = (end - start + incr - 1)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
排除循环的任何特殊中断(中断、改变计数器等),公式如下:
iterations = (end - start+incr)/incr,其中关系运算符为 >= 或 <=
如果关系运算符是 < 或 >,则迭代次数 = (end - start+incr-1)/incr
这个可以测试如下
/*
* Baring any special disruption of the loop (breaks, altering counter, etc), the formula is as follows:
iterations = (|start-end|+|incr|)/|incr|, where relational operator is >= or <=
- if relational operator is < or >, then iterations = ((|start-end|+|incr|-1)/|incr|
* @author rahul.arora, WJS
*/
import java.util.Random;
public class LoopIterationCalcTester {
public static void main(String[] args) {
for (int x = 0; x < 100; x++) {
Random r = new Random();
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + 20;
int incr = r.nextInt(50)+1;
for (int i = start; i < end; i += incr) {
count++;
}
int calc = (end - start-1+incr)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + 20;
int incr = r.nextInt(50)+1;
for (int i = start; i <= end; i += incr) {
count++;
}
int calc = (end - start+incr)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + 20;
int incr = r.nextInt(50)+1;
for (int i = end; i >= start; i -= incr) {
count++;
}
int calc = (end - start+incr)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
for (int k = 0; k < 10000; k++) {
int count = 0;
int start = r.nextInt(20)+1;
int end = r.nextInt(1000) + 20;
int incr = r.nextInt(50)+1;
for (int i = end; i > start; i -= incr) {
count++;
}
int calc = (end - start-1+incr)/incr;
if (calc != count) {
System.out.println("Oops");
}
}
}
}
}