【问题标题】:Determining Number of Iterations in a loop (Java)确定循环中的迭代次数(Java)
【发布时间】:2021-03-03 13:48:21
【问题描述】:

我想知道是否有任何人知道的一个公式可以预先计算循环中的迭代次数。

我玩弄了它并得出了等式:

迭代次数等于((终值与初值之差的绝对值)加(增/减的绝对值))除以增/减的绝对值

预期 = (int)((Math.abs(final-initial) + Math.abs(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)公式

我已经测试了几次,但还不确定。

谢谢。

【问题讨论】:

  • 您是否假设循环是 for 循环,不包含中断或返回(或异常),具有简单的循环计数器,并且不更改循环体内的循环计数器?
  • 我想应该是 ((43-9)/8)+1

标签: java algorithm formula


【解决方案1】:

排除任何特殊的循环中断(中断、更改计数器等),您可以测试以下公式。如果终止测试是< 而不是<=,你应该从开始减去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");
    }
}

【讨论】:

  • 谢谢,所以公式 (end - start)/incr + 1 或 (end - start - 1)/incr + 1 有效吗?
  • 不,我在编程时实际上并不需要它,但我在 5 月份参加考试,这个公式会派上用场,所以我只想确定
【解决方案2】:

排除任何特殊的循环中断(中断、更改计数器等),公式如下:

iterations = (end - start+incr)/incr,其中关系运算符为 >= 或

如果关系运算符是,那么iterations = (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");
            
            }
        }
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多