先来看看生活中的一些场景:
(1)食堂阿姨打菜:接过顾客的餐盘→询问菜品→打菜→递回餐盘,重复以上过程,直到所以顾客的菜都打完了。
(2)快递员送快递:查看送件地址→赶往目的地→电话告知收件人→收件人签收→交快递件,重复以上过程,直到所有需要送的快递都处理完了。
以上场景都有一个共同的特点:有条件地重复地做一件事,每一次做的事情不同但类似。
程序是伪类解决实际问题的,实际问题中存在这重复动作,那么程序中也应该有相应的描述,这就是循环。
/*计算1+2+3+……+10
* 方案一
* */
var sum1 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
/*方案二*/
var sum2 = 0;
sum2 += 1;
sum2 += 2;
sum2 += 3;
sum2 += 4;
sum2 += 5;
sum2 += 6;
sum2 += 7;
sum2 += 8;
sum2 += 9;
sum2 += 10;
但是这两种方案的描述方式都不太理想,如果是要加到10000呢?
注意观察方案二,它重复地做一件事(将一个数加到sum2中),每一次做的不同但是类似。
我们希望能找到一种更好的描述方式
/*方案三:改造方案二*/
var sum3 = 0;
var n = 1;
while(n <= 10){
sum += n;
n++;
}
方案三表达的含义和方案二一样,但是表达方式要好得多,比如加到10000,只需要把条件n<=10改为n<=10000
white是表示“当……则……”,也就是当某个条件成立时,则一直重复做。
打开调试工具,在watch窗口分别查看sum、n以及n<=10的值,可以从指示器看到循环的执行过程,检测变量的变化。
do……while循环和while循环的区别在于,前者是先执行后判断(先斩后奏),后者则是先判断再执行,如果条件不满足,前者也会执行依次。所以do……while至少会执行依次。
案例:输出所有水仙花数
/*
* (1)获取输入的三位数
* (2)计算三位数的各位数并求立方和
* (3)判断立方和与该数是否相等,如果相等就打印该数是水仙花数,否则就打印不是水仙花数
* */
//var narNum = Number(prompt("请输入一个三位数"));
var narNum = 100;
while (narNum <= 999) {
var hundreds = Math.floor(narNum / 100);
var decade = Math.floor(narNum / 10) % 10;
var theUnit = narNum % 10;
var sum = hundreds * hundreds * hundreds + decade * decade * decade + theUnit * theUnit * theUnit;
if(sum == narNum){
alert(narNum+"是水仙花数");
}
narNum++;
}
案例:GDP预测
var usGDP = 142562.75;
var chinaGDP = 49089.82;
var year = 2009;
do{
usGDP = usGDP*1.02;
chinaGDP = chinaGDP*1.08;
year++;
}while(usGDP >= chinaGDP);
alert(year+"年中国("+chinaGDP+")赶超美国("+usGDP+")");
总结一下循环的套路
(1)初始状态
(2)循环条件
(3)循环体(要重复做的事情)
(4)为下次循环作准备()
那如何去写循环的程序呢?回答四个问题:
(1)初始状态是怎样的
(2)重复做的条件是什么
(3)重复做什么
(4)怎么过渡到下一次循环
|
水仙花数问题 |
GDP预测 |
初始状态 |
narNum = 100 |
var year = 2009; var usGDP = 142562.75; var chinaGDP = 49089.82 |
循环条件 |
narNum <= 999 |
usGDP >= chinaGDP |
循环体 |
var hundreds = Math.floor(narNum / 100); var decade = Math.floor(narNum / 10) % 10; var theUnit = narNum % 10; var sum = hundreds * hundreds * hundreds + decade * decade * decade + theUnit * theUnit * theUnit; if(sum == narNum){ alert(narNum+"是水仙花数");} |
usGDP = usGDP*1.02; chinaGDP = chinaGDP*1.08;
|
为下次循环作准备 |
narNum++; |
year++; |
案例:计算圆周率,π=(1-1/3+1/5-1/7+……)*4最后一项的绝对值小于10-6
分析:将公式稍微变化一下
1-1/3+1/5-1/7+……
变化为(+1/1)+(-1/3)+(+1/5)+(-1/7)+……
那么它和我们之前解决的1+2+3+……+10的问题就非常类似了,都是累加的问题,只不过每次加的内容不同而已。
我们可以将每一项拆分为三部分:
t = 符号*1/分母
(1)初始状态是怎样的
sum = 0;
t = 1;
sign = 1;
deno = 1;
(2)重复做的条件是什么
|t| >= 10-6
(3)重复做什么
sum += t;
(4)怎么过渡到下一次循环
sign = -sign;
deno += 2;
t = sign*1/deno;
for循环是比较常用的一个循环结构,能用while和do……while写的循环都可以用for循环来写,它把初始条件和为下次循环做准备的条件放在了for后面对括号中。
格式:for(初始条件;循环条件;为下次循环做准备){重复做的内容}
找出所有水仙花数的案例,用for循环来写
for(var num=100; num<=999; num++){
var hundreds = Math.floor(num / 100);
var decade = Math.floor(num / 10) % 10;
var theUnit = num % 10;
var sum = Math.pow(hundreds,3) + Math.pow(decade,3) + Math.pow(theUnit,3);
if(sum == num){
alert(num+"是水仙花数");
}
}