循环结构
1循环结构的概念
先看看生活中的一些场景
(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){
sum3 += n;
n++;
}
方案三表达的含义和方案二一样,但是表达方式要好得多,比如加到10000,只需要把条件 n<=10改为n<=10000。
2 white循环
while 是表示“当...........则...........”,也就是当某个条件成立时,则一直重复做。(流程图)
while(判断条件{
执行语句;}
(调试工具查看程序运行轨迹以及变量的变化情况)
3 do while 循环
do-while 流程图:
do{
执行语句;
}while(条件判断)
案例:找出所有的水仙花数
<script>
var num = 100;
while (num <= 999) {
var b100 = Math.floor(num / 100);
var b10 = Math.floor((num % 100) / 10);
var b1 = num % 10;
var sum = b100 * b100 * b100 + b10 * b10 * b10 + b1 * b1 * b1;
if(sum == num){
alert(num + "是水仙花数");
}
num++;
}
</script>
案例:GDP预测
<script>
var year = 2009;
var gdp_usa = 142562.75;
var gdp_china = 49089.82;
while(gdp_usa > gdp_china){
gdp_usa *= (1 + 0.02);
gdp_china *= (1 + 0.08);
year++
}
alert(year + "年,中国("+gdp_china+")将超过美国("+gdp_usa+")");
</script>
总结一下循环程序的套路:
(1)循环的初始状态
(2)循环条件
(3)循环体(要重复做的事情)
(4)为下次循环做准备
那如何去写循环的程序呢?回答四个问题:
(1)初始状态是怎样的?
(2)重复做的条件是什么?
(3)重复做什么?
(4)怎么过渡到下一次循环?
| 水仙花数问题 | GDP预测问题 |
初始状态 | var num = 100 | var year = 2009; |
循环条件 | num <= 999 | gdp_usa > gdp_china |
循环体 | var b100 = Math.floor(num / 100); var b10 = Math.floor((num % 100) / 10); var b1 = num % 10; var sum = b100 * b100 * b100 + b10 * b10 * b10 + b1 * b1 * b1; if(sum == num){ alert(num + "是水仙花数"); } | gdp_usa *= (1 + 0.02);
|
为下次循环做准备 | num++ | 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+4+.......+10问题就非常类似了,即都是求累加和的问题,只不过每次加的内容不同而已。
我们可以将每一项拆分为三部分:
t = 符号*1/分母
1) 初始状态是怎样的?
sum = 0
t = 1
sign = 1
denominator(分母) = 1
numerator (分子)= 1
num = sign* numerator /denominator
2) 重复做的条件是什么?
|t| >= 10-6
3) 重复做什么?
sum += num
4) 怎么过渡到下一次循环?
sign *= -1
denominator += 2
num = sign* numerator /denominator
var sum = 0;//累加和
var denominator = 1;//分母
var sign = 1;//符号
var num = 1;//每一项的分数
while(Math.abs(num) >= 1.0e-6){
sum += num;
denominator += 2;
sign *= -1;
num = sign/denominator;
}
var pi = sum *4;
alert(pi);