生活中的循环场景:
1.食堂阿姨打菜:接过顾客的的餐盘→询问菜品→打菜→打菜→递回餐盘,重复以上过程,直到所有顾客的菜都打完了。
2.看快递员送快递:查看送件地址→赶往目的地→电话告知收件人→收件人签收→交递快件,重复以上过程,直到所有需要送的快递都处理完了。
3.公交司机......
以上场景都有一个共同特点:有条件的重复地做一件事。每次做的事情不同但类似。
程序是为了解决实际问题的,实际问题中存在重复动作,那么程序中也应该有相应的描述,这就是循环。
<script language="JavaScript"> /*计算1+2+3..+10; * 方案一 /* var sum = 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; alert(sum); </script>
但是这两种方案的描述方式都不太理想,如果是要加到1000呢?
注意观察方案二,他重复地做一件事(将一个数加到sum2中)每一次做的不同但类似。
我们希望做到
* 方案三 var sum3 = 0; var n = 1; while(n <= 10){ sum3 += n; n++; };
方案三表达的含义和方案二一样,但是表达方式要好很多,比如加到1000,只需要把n<=10改为n<==1000。
while循环
While循环是表示:当...则...,也就是当某个条件成立时,则一直重复做。
(调试工具查看运行轨迹以及变化情况)
do{
}
while( )
区别:
do循环体内必然要执行一次
var Num = 100; while (Num <= 999) { var Fir_Num = Math.floor(Num / 100); var Sec_Num = Math.floor((Num % 100) / 10); var Thr_Num = Num % 10; var sum = Math.pow(Fir_Num, 3) + Math.pow(Sec_Num, 3) + Math.pow(Thr_Num, 3); if(sum == Num){ alert(Num+"水仙花数") }/* alert(Num + (sum == num ? "是" : "不是") + "水仙花数");*/ Num++;}
do while 循环:
var year = 2009; var CHGDP = 49089.82; var USGDP = 142562.75; do{ CHGDP = CHGDP * (1+0.08); USGDP = USGDP * (1+0.02); year++ }while(CHGDP < USGDP); alert(year);
While循环
案例
<script> /* 初始状态 * while(循环的条件)*/ var sum =0;//累加和 var t = 1;//每一项分数 var sign =1;//分数的符号 var deno = t;//分母 while(Math.abs(t) >=1e-6){ sum +=t; sign = -sign; deno +=2; t = sign*1/deno;} var pi = sum*4; alert(pi); </script>
总结一下循环的套路:
1.初始状态,
2.循环条件
3.循环体(需要重复做的事情)
4.为下次循环做准备
那如何去写循环的程序呢? 回答四个问题
| 水仙花数问题 | GDP预测问题 |
初始状态 | Num = 100 | var year = 2009; var CHGDP = 49089.82; var USGDP = 142562.75; |
循环条件 | (Num <= 999)
| CHGDP < USGDP
|
循环体 | var Fir_Num = Math.floor(Num / 100); var Sec_Num = Math.floor((Num % 100) / 10); var Thr_Num = Num % 10; var sum = Math.pow(Fir_Num, 3) + Math.pow(Sec_Num, 3) + Math.pow(Thr_Num, 3); if(sum == Num){ alert(Num+"水仙花数") } } | CHGDP = CHGDP * (1+0.08); USGDP = USGDP * (1+0.02); year++;
|
为下次做准备 | Num++ | year++; |
1-1/3+1/5-1/7+...
变化为(+1/1)+(-1/3)+(+1/5)+(-1/7)
那么它和我们之前解决的1+2+3+4+5...+10问题就非常类似了
和的问题,只不过每次加的内容不同而已。
我们可以将每一项拆分为三部分:
T=符号*(1/分母)
1.初始状态是怎样的
Sum = 0;
T = 1;
Sign= 1;
Deno = t
2.重复做的条件是什么
|t|>=10的负六次方
3.重复什么
Sum+= t
4.怎么过渡到下一次循环
Sign = -sign
Deno += 2
T = sign * 1/deno
for循环
如果有 for- 这种语法来遍历数组就会方便很多。
案例:
for(var num =100;num<=999;num++){ var num100 = Math.floor((num%1000)/100); var num10 = Math.floor((num%100)/10); var num1= Math.floor(num%10); var sum = Math.pow(num100,3)+Math.pow(num10,3)+Math.pow(num1,3); if(num==sum) alert(num +"水仙花数"); }