循环结构

来源:互联网 发布:女生做淘宝美工累吗 编辑:程序博客网 时间:2024/06/15 12:24

循环结构

循环的共同的特点:有条件地重复地做一件事,每一次做的事情不同但类似。程序是为了解决实际问题的,实际问题中存在着重复动作,那么程序中也应该有相应的描述,这就是循环。案例:计算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<=100005.2 while循环while是表示“当……则……”,也就是当某个条件成立时,则一直重复做。(调试工具查看程序运行轨迹以及变量的变化情况)案例:输出所有水仙花数<script> var num = 100; while (num <= 999) { 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(sum == num){ alert(num+"是水仙花数"); } num++; }</script>案例:GDP预测:<script> var year = 2009; var gdp_usa = 142562.75; var gdp_chn = 49089.82; while(gdp_usa>gdp_chn){ gdp_usa *= (1+0.02); gdp_chn *= (1+0.08); year++; } alert(year+"年,中国("+gdp_chn+")将超过美国("+gdp_usa+")");</script>总结一下循环的套路(1)初始状态(2)循环条件(3)循环体(要重复做的事情)(4)为下次循环作准备()那如何去写循环的程序呢?拿到问题,不要胡思乱想,就回答四个问题:(1)初始状态是怎样的?(2)重复做的条件是什么(3)重复做什么(4)怎么过渡到下一次循环 水仙花数问题 GDP预测问题初始状态 var num = 100 var year = 2009;var gdp_usa = 142562.75;var gdp_chn = 49089.82;循环条件 num <= 999 gdp_usa>gdp_chn循环体 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(sum == num){ alert(num+"是水仙花数");} gdp_usa *= (1+0.02);gdp_chn *= (1+0.08);为下次循环作准备 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+……+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;5.3 for循环5.4 循环辅助语句break:跳出所在的switch或者循环结构案例:素数判断var n = Number(prompt("请输入一个自然数"));var m = Math.ceil(Math.sqrt(n));//根据相关数学定理,查找范围可缩小至[2,sqrt(n)]var found = false;//找到因子的标记for(var i=2; i<=m; i++){ if(n%i == 0){ found = true; break;//找到则提前结束 }}alert(found?"不是素数":"是素数");continue:结束本次循环,开启下一次循环。案例:对100以内既不是3的倍数也不是5的倍数的数求和常规思路:对满足条件的数累加var sum = 0; for(var n=1; n<=100; n++){ if(n%3!=0 && n%5!=0){ sum += n; } } alert(sum);另一种思路:不满足条件的就放过var sum = 0;for(var n=1; n<=100; n++){ if(n%3==0 || n%5==0){ continue;//结束本次循环 } sum += n;}alert(sum);第二种思路的好处是:结构清晰也就是我们在进行数据处理之前,先把各种不符合条件的情况先排除,然后在处理符合条件的情况(这个一般是程序的主体)如果循环体的主体代码的执行有两个前提条件,常规思路是这么写的,如果循环体主体代码较多,该程序的可读性较差。for(……){ if(条件1){ if(条件2){ 循环体主体代码(可能代码较多) }else{ alert("错误提示2") } }else{ alert("错误提示1"); }}换另外一个思路来描述,是这样的for(……){ if(!条件1){ alert("错误提示1"); continue; } if(!条件2){ alert("错误提示2"); continue; } 循环体主体代码}break和continue的联系和区别

原创粉丝点击