专业编程基础技术教程

网站首页 > 基础教程 正文

java 核心技术-12版 卷Ⅰ- 3.8.4 循环(for)

ccvgpt 2024-10-19 03:27:53 基础教程 7 ℃

3.8.4 确定性循环

for 循环语句是支持迭代的一种通用结构,它由一个计数器或类似的变量控制迭代次数,每次迭代后这个变量将会更新。如图 3-12 所示,下面的循环将在屏幕上显示出打印数字1 ~ 10:

java 核心技术-12版 卷Ⅰ- 3.8.4 循环(for)

for(int i=1;i<=10;i++)
		System.out.println(i);

for 语句的第 1 部分通常是对计数器初始化;第 2 部分给出每次新一轮循环执行前要检测的循环条件;第 3 部分指定如何更新计数器。

与 C++ 类似,尽管 Java 允许在 for 循环的各个部分放置任何表达式,但有一条不成文的规则:for 语句的 3 个部分应该对同一个计数器变量进行初始化、检测和更新。若不遵守这一规则,所写的循环很可能晦涩难懂。

即使受这个规则所限,仍有无尽可能,你可以写各种各样的 for 循环。例如,可以编写下面这个倒计数的循环

for (int i =0;i>0; i--)
				System.out.println(“Counting down ... ” + i);
System.out.println(“Blastoff!”);

警告:在循环中,检测两个浮点数是否相等需要格外小心。下面的for 循环:

for(double x=0; x!=10;x+= 0.1)
  	System.out.println(x);

可能永远不会结束。由于存在舍入误差,可能永远达不到精确的最终值。在这个例子中,因为0.1 无法精确地用二进制表示,所以,x 将从9.99999999999998 跳到 10.09999999999998

在for 语句的第1部分中声明一个变量之后,这个变量的作用域会扩展到这个for 循环体的末尾。

for(int i =1 ; i <= 10 ;i ++){ ... } // 大括号之外,i 不再有效

特别指出,如果在for 语句内部定义一个变量,这个变量就不能在循环体之外使用。因此,如果希望在for 循环体之外使用循环计数器的最终值,就要确保在循环体之外声明这个变量。

int i;
for(i = 1; i <=10;i++) {...}

另一方面,可以在不同的for 循环中定义同名的变量

for(i = 1; i <=10;i++) {...}
for(i = 1; i <=20;i++) {...}

for 循环语句只是 while 循环的一种简化形式。例如,

for ( int i =10 ; i >0 ; i --){
			System .out.println(“Counting down ... ” + i);
}

可以重写为:

int i =10;
while(i >0){
	System.out.println(“Counting down ... ” + i);
	i--;
}

程序清单 3-5 (LotteryOdds) 给出了一个 for 循环的典型示例。

这个程序用来计算抽奖的概率。例如,如果从 1 ~ 50 的数字中取6个数字来抽奖,那么会有 (50 * 49 * 48 * 47 * 46 * 45) / (1* 2 * 3 * 4 * 5 * 6)种可能的结果,所以中奖的概率是 1/ 158907000 。祝你好运!

一般情况下,如果从 N 个数字中 抽取 K 个数字, 就会有 n * (n -1) * (n -2) * ... (n = k +1) / ( 1 *2*...*k) 种可能。下面的for 循环 可以计算这个值:

int lotteryOdds = 1;
for ( int i = 1; i <= k ; i++)
		lotteryOdds = lotteryOdds * (n - i + 1) / i ;

注释 : 3.10.3 节将会介绍“泛型 for 循环” (又称为 for each 循环),利用这个循环可以很方便地访问一个数组或集合中的所有元素。

package corejava.chapter3.lession8;

import java.util.*;

/**
 * This program demonstrates a <code>for</code> loop.
 * @version 1.20 2004-02-10
 * @author Cay Horstmann
 */
public class LotteryOdds
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        System.out.print("How many numbers do you need to draw? ");
        int k = in.nextInt();

        System.out.print("What is the highest number you can draw? ");
        int n = in.nextInt();

        /*
         * compute binomial coefficient n*(n-1)*(n-2)*...*(n-k+1)/(1*2*3*...*k)
         */

        int lotteryOdds = 1;
        for (int i = 1; i <= k; i++)
            lotteryOdds = lotteryOdds * (n - i + 1) / i;

        System.out.println("Your odds are 1 in " + lotteryOdds + ". Good luck!");
    }
}

Tags:

最近发表
标签列表