循环结构
循环结构
1。循环结构的基本概念
先来看看生活中的一些场景:
(1)食堂阿姨打菜:接过顾客的餐盘→询问菜品→打菜→递回餐盘,重复以上过程,直到所有顾客的菜都打完为止。
(2)快递员送快递:查看送件地址→赶往目的地→电话告知收件人→收件人签收→交快递件,重复以上过程,直到所有需要送的快递都处理完为止。
(3)公交司机:驾驶到一个站点→停车→开前后门→等乘客上下车→关门→继续行驶,重复以上过程,直到交接班为止。
(4)作业流程:老师布置作业→我们完成作业→检查作业→上交作业,重复以上过程,直到学期结束为止。
以上场景都有一个共同点:有条件地重复地做一件事,每一次做的事情不同但类似。
程序是为了解决实际问题的,实际问题中存在着重复动作,那么程序中也应该有相应的描述,这就是循环。
案例:计算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。while循环
while是表示“当......则......”,也就是当某个条件成立时,则一直重复做。
(流程图)
(调试工具查看程序运行轨迹以及变量的变化情况)
var
num =
1;//加数
varsum
= 0;//结果
while(num<=
100){
sum += num;//sum = sum + num;
num++;
}
do......while:
var
num =
1;//加数
varsum
= 0;//结果
do{
sum += num;//sum = sum + num;
num++;
}while(num<=
100)
var
num =
100;
while (num<=
1000) {
var a100=
Math.floor(num/
100);
var a10=
Math.floor((num%
100) / 10);
var a1=
Math.floor(num%
10);
var result=
Math.pow(a100,3) +
Math.pow(a10,3) +
Math.pow(a1,3);
if (num==
result) {
alert(result+
"是水仙花数");
}
num++;
}
var
year =
2009;
var china=
49089.82;
var USA=
142562.75;
while(USA>
china){
china *= (1+
0.08);
USA *= (1+
0.02);
year++;
}
alert(year+
"年,中国("+china
+")将超过美国("+USA
+")");
总结循环的套路:
(1)循环的初始状态
(2)循环条件
(3)循环体(要重复做的事)
(4)为下一次循环做准备()
如何去写循环程序?回答四个问题:
(1)初始状态是怎样的?
(2)重复做的条件是什么?
(3)重复作什么
(4)怎么过渡到下一次循环
|
水仙花数问题 |
DGP预测 |
初始状态 |
varnum = 100
|
varyear
= 2009; |
循环条件 |
num <= 999 |
USA > china |
循环体 |
var
a100 =
Math.floor(num/
100);
|
china*= (1
+ 0.08); |
为下次循环做准备 |
num++ |
year++ |
案例:计算圆周率,π= (1 - 1/3 + 1/5 - 1/7 + ........)* 4
最后一项的绝对值小于10-6
分析:将公式稍微变化一下
变化为:((+1/1)+(-1/3)+(+1/5)+(-1/7)+ ........)* 4
那么它和我们之前解决的1+2+3+.....+10问题就非常类似了,即都是求累加和的问题,只不过每次加的内容不同而已。
我们可以将每一项拆分为三部分:
t = 符号*1/分母
(1)初始状态
sum = 0;
t = 1;
sign = 1;
denominator = t;//分母
(2)重复做的条件
|t|>= 10-6
(3)重复做什么
sum += t;
(4)怎么过渡到下一次循环
sign = -sign;
denominator += 2;
t = sign*1/denominator;