Javascript基础(五)之循环结构

2、循环结构-1
1、问题
1、控制台中输出一句Hello World
2、控制台中输出10句Hello World
3、控制台中输出1000句Hello World
4、将 1000 句 Hello World 改成 “你好世界!”
5、在 1000 句你好世界基础上 增加
第 1 句 你好世界!

第1000句 你好世界!
2、什么是循环
循环:一遍又一遍的重复的执行相同或者相似的代码
生活中的循环:
1、上学
2、运动员跑圈
3、活着
4、地球公转和自转
循环的特点:
1、循环条件
指定循环的次数,或者继续执行循环的条件
2、循环体:也成为循环操作,重复做的事情是什么
3、while 循环
语义:当 条件 满足的时候,去做某些事情
1、语法
while(条件){
循环体(循环操作)
}

        执行流程:
            1、判断条件,如果条件为真,则执行循环体中的内容,如果条件为假,则跳出循环结构
            2、执行完循环体,再一次判断条件,
    2、练习
        1、打印输出 1 - 100 之间所有的数字
        2、打印输出 1 - 100之间所有的偶数
        3、计算1 - 100 之间所有的奇数和
<script>
            /*打印输出 1句 Hello World*/
            function fun1(){
                console.log("Hello World");
            }

            /*打印输出 10句 Hello World*/
            function fun2(){
                //1、条件:10遍 ,从第1遍开始,到第10遍结束
                var i=1;//循环次数
                //2、操作:console.log("Hello World");
                while(i<=1000){
                    console.log("第"+i+"遍你好 世界!");
                    //循环次数进行增加(自增)
                    i++;//更新循环条件
                }

            }
            /*打印1 - 100 之间所有的数字*/
            function fun3(){
                //循环条件:从第1遍开始,到第100遍结束
                var i=1;
                while(i <= 100){
                    //循环操作:将循环条件打印输出
                    console.log(i);
                    i++;
                }
            }

            /*打印 1- 100之间所有的偶数*/
            function fun4(){
                //循环条件:从第1遍开始,到第100遍结束
                var i = 1;
                while(i<=100){
                    /*循环操作:
                        1、判断 循环条件值 是否为 偶数
                        2、如果是偶数的话打印输出
                        3、循环条件的自增
                    */
                    if(i % 2 == 0){
                        console.log(i);
                    }
                    i++;
                }
            }

            /*计算 1- 100之间所有奇数的和*/
            function fun5(){
                //循环条件:从1开始到100结束
                var sum = 0;//用于累加 i 的值
                var i = 1;
                while(i<=100){
                    /*循环操作:
                        1、判断是否为奇数
                        2、如果是奇数的话,将循环条件值累加
                        3、更新循环变量
                    */
                    if(i % 2 == 1){
                        sum += i;
                    }
                    i++;
                }
                console.log("和为:"+sum);
            }

            /*打印 1- 100之间所有非3倍数的数字(continue)*/
            function fun6(){
                //条件:1-100
                var i = 1;
                while(i <= 100){
                    //操作:碰见3的倍数时,终止打印
                    if(i % 3 == 0){
                        i++;
                        continue;
                    }
                    console.log(i);
                    i++;
                }

            }

            /*打印 1 - 100之间非3倍数的数字(非continue)*/
            function fun7(){
                var i = 1;
                while(i <= 100){
                    if(i % 3 != 0){
                        console.log(i);
                    }
                    i++;
                }
            }

            /*要求用户一直不停的录入数据,并且将录入的数据打印在控制台上,直到输入 exit 为止*/
            function fun8(){
                //循环条件:输入 exit 为止,次数:无限次
                while(true){
                    /*循环操作:
                        1、用户录入数据
                        2、判断,如果用户录入的是 exit,则 退出循环
                        3、将录入的数据打印在控制台上
                    */
                    var msg = prompt("请输入一句话:");
                    if(msg == "exit"){
                        alert("Good Bye!");
                        break;//结束循环的条件
                    }
                    console.log(msg);
                }

            }
        </script>
    3、循环中的流程控制
        1、continue
            终止本次循环的执行,继续开始下次循环
            ex:
                打印 1 - 100之间所有非3的倍数的数字
        2、break
            结束整个循环的运行
            可以用在:不确定循环次数的时候去结束循环
            ex:
                要求用户 从弹框中 录入数据,录入完直接打印在控制台上,直到输入 exit 位置
4、do...while 循环
    1、特点
        先执行循环操作,再判断循环条件
    2、语法
        do{
            循环操作
        }while(条件);
    3、while 与 do...while 之间的区别 
        1、while
            先判断条件,再执行循环体
            最少执行 0 次循环
        2、do...while
            先执行循环体,再判断循环条件
            最少执行 1 次循环
    4、练习
        1、改写日期计算器为循环版本
        2、猴子吃桃
            猴子第一天摘了若干个桃子,当即吃了一半,还不过瘾,又多吃一个。第二天早上,将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃前一天的一半零一个。到第10天早上,发现只剩一个桃子。求:第一天摘了多少个桃子
<script>
            function calDate(){
                var year = prompt("Input a year:");
                var month = prompt("Input a month:");
                var day = Number(prompt("Input a day:"));
                var totalDays = 0;
                //统计 month 之前所有月的 天数
                var i = month - 1;//从 month前一个月开始计算
                //条件:到1月为止
                while(i>=1){
                    switch(i){
                        case 11:
                        case 9:
                        case 6:
                        case 4:
                            totalDays +=30;
                            break;
                        case 10:
                        case 8:
                        case 7:
                        case 5:
                        case 3:
                        case 1:
                            totalDays += 31;
                            break;
                        case 2:
                            totalDays += 28;
                            if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
                                totalDays += 1;
                            }
                            break;
                    }
                    i--;
                }
                totalDays += day;
                console.log("是第"+totalDays+"天");
            }

            /*猴子摘桃*/
            function calNumber(){
                var day = 10;//已知第10天
                var left = 1;//已知最后剩一个
                var total;//前一天的剩余量
                //循环条件:从第10天 算到第 2天为止
                while(day >= 2){
                    //循环操作:
                        //1、计算 total 是多少
                        //2、将total 赋值给 left 继续计算下一次的total
                    total = (left + 1) * 2;
                    left = total;
                    console.log("第"+(day-1)+"天,摘了"+total+"个桃子");
                    day--; //天数递减
                }
                console.log("第一天,猴子摘了"+total+"个桃子!");
            }
        </script>

循环结构-2
1、for 循环
1、while
打印 1 - 10 之间所有的数字
var i = 1; //1、声明循环条件变量
while(i <= 10){ //2、循环条件判断
console.log(i);//3、循环操作
i++;//4、更新循环变量
}
2、for 循环
目的:为了简化 while 循环的开发
for(表达式1;表达式2;表达式3){
循环操作
}
表达式1:声明循环条件变量
表达式2:循环条件判断
表达式3:更新循环变量

        流程:
            1、计算表达式1的值 即声明循环条件(只执行1次)
            2、计算表达式2的值 即计算循环条件时否满足,如果条件为真,则继续向下执行,否则退出循环
            3、条件为真时,执行循环体
            4、计算表达式3的值 即更新循环变量
            5、计算表达式2的值 即继续判断循环条件,回到第2步
        练习
            1、打印 1 - 100 之间所有的数字
            2、打印 1 - 100 之间所有的偶数
            3、计算 1 - 100 之间所有奇数的和
            4、定义一个函数,打印乘法口诀中的任意一行
                1*1=1
                1*2=2 2*2=4
                1*3=3 2*3=6 3*3=9
                1*4=4 2*4=8 3*4=12 4*4=16
            5、定义一个函数,计算 1+1/3+1/5+...+1/999的和
                1   : 1/1
                1/3 : 1/3
                1/5 : 1/5
            6、兔子问题:有1对兔子,从出生后的第3个月起每个月都生1对兔子,小兔子长到第3个月后每个月又生一对兔子。加入兔子都不死,问某个月的兔子总数是多少?

            菲波那切数列
            n1  n2
            1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55

            求第n个月的兔子的总量
            function f(n){
                如果 n==1 或 n == 2 ,直接返回1
                否则 就返回 上个月 和 上上个月 的量的和
                返回 f(n-1) + f(n-2)
            }
            求第5个月的兔子总量:f(5)
             f(5) = f(4) + f(3)
              f(4) = f(3) + f(2)
                    f(3) = f(2) + f(1)
                f(3) = f(2) + f(1)
<script>
            /*打印 1-100 之间所有的数字*/
            function fun1(){
                //表达式1:声明循环变量 var i=1
                //表达式2:循环条件判断 i<=100
                //表达式3:更新循环变量 i++
                //循环操作 打印循环条件 i 的值
                for(var i=1;i<=100;i++){
                    console.log(i);
                }
            }

            function fun2(){
                //表达式1:声明循环变量 var i=1
                //表达式2:循环条件判断 i<=100
                //表达式3:更新循环变量 i++
                //循环操作 判断 循环变量是否为偶数,偶数则打印
                /*for(var i=1;i<=100;i++){
                    if(i % 2 == 0){
                        console.log(i);
                    }
                }*/

                //表达式1:从 2 开始
                //表达式2:到 100 结束
                //表达式3:更新时 +2
                for(var i=2;i<=100;i+=2){
                    console.log(i);
                }
            }
            /*累加 1-100 之间所有奇数的和*/
            function fun3(){
                //循环为:声明累加和的变量
                var sum = 0;
                //表达式1:从1开始
                //表达式2:到 100 结束
                //表达式3:更新变量 i+=2
                for(var i=1;i<=100;i+=2){
                    sum += i;
                }
                console.log(sum);
            }

            /*猴子吃桃问题*/
            function fun4(){
                var left = 1;//第10天的剩余
                var total; // 前一天桃子总数
                for(var day=10;day>1;day--){
                    total = (left + 1) * 2;
                    left = total;
                }
                console.log(total);
            }

            function fun5(){
                var line = prompt("请输入要打印的行数:");
                var str = "";//用于 追加 每次计算出的 乘法口诀的数据
                //条件:从 1 开始, 到line结束
                for(var i=1;i<=line;i++){
                    //操作:打印 循环变量 * line = (变量*line)
                    var s = i+"*"+line+"="+(i*line);
                    str += s + "\t";
                }
                console.log(str);
            }

            function fun6(){
                var sum = 0;
                for(var i=1;i<=1000;i+=2){
                    sum += (1/i);
                }
                console.log(sum);
            }

            // 计算第 n 个月的兔子总量(递归)
            /*
                递归:在函数内,又调用了自己
                递归调用的内层函数,是在外层函数还未结束时就已经开始了,外层函数的调用,就会被阻塞
                缺点:算法复杂度太高,浪费内存
                解决:大部分递归,可以被循环所替代
            */
            /*
                 如果 n==1 或 n == 2 ,直接返回1
                 否则 就返回 上个月 和 上上个月 的量的和
                 返回 f(n-1) + f(n-2)
                */
            function f(n){
                if(n == 1 || n == 2){
                    return 1;
                }
                return f(n-1) + f(n-2);
            }
            /*通过 循环 解决递归的问题*/
            function f1(n){
                if(n == 1 || n == 2){
                    return 1;
                }
                var f1 = 1 , f2 = 1 , fn;
                for(var i=1;i<=n-2;i++){
                    fn = f1 + f2;
                    f1 = f2;
                    f2 = fn;
                }
                return fn;
            }
            /*兔子问题:菲波那切数列*/
            function fun7(){
                var n1 = 1;
                var n2 = 1;
                for(var i=1;i<=10;i++){
                    console.log(n1);
                    console.log(n2);
                    n1=n1 + n2;
                    n2=n1 + n2;
                }
            }

            function testF(){
                var result = f1(100);
                console.log("共有兔子:"+result+"只");
            }
        </script>
    3、for 循环表达式的特殊用法
        1、表达式1 允许为空
            可以省略表达式1,但;不能省
            for(;条件;自增){

            }
            ex:
            var i=1;
            for(;i<=10;i++){
                console.log(i);
            }
        2、表达式2 允许为空
            可以省略表达式2,但;不能省
            如果省略表达式2,那么就是 "死循环"
        3、表达式3 允许为空
            死循环
        4、三个表达式都可以省略,但;不能省
            for(;;){
                if(条件)
                    break;
                i++;
            }
        5、表达式1 和 表达式3 的多样化
            表达式1:允许声明多个变量,用,隔开
            表达式3:允许更新多个变量,用,隔开
    4、循环嵌套
        for,while,do...while都可以实现嵌套操作
        ex:
            for(var i=1;i<=9;i++){  //外层循环
                for(var j=1;j<=9;j++){ //内层循环

                }
            }
        练习:
            1、在控制台上打印输出 "*"
            2、在控制台上打印输出 "*****"
            3、在控制台上打印输出 
                *****
                *****
                *****
                *****
                *****
            4、在控制台上打印输出
                *
                **
                ***
                ****
                *****
            5、在控制台上打印输出
                         *  4个空格1个* (5-行数)
                        **  3个空格2个*
                       ***  2个空格3个*
                      ****  1个空格4个*
                     *****  0个空格5个*
<script>
        /*左对齐打印星星*/
            function printStar(){
                for(var j=1;j<=9;j++){//控制的是 行数
                    for(var i=1,str="";i<=j;i++){ //星星数量(列数 )
                        str += "*";
                    }
                    console.log(str);
                }
            }

            /*打印 99 乘法表*/
            function print(){
                for(var i=1;i<=9;i++){
                    var str="";
                    for(var j=1;j<=i;j++){
                        var result = j+"*"+i+"="+(j*i)+"\t";
                        str += result;
                    }
                    console.log(str);
                }
            }
      /*右对齐打印星星*/
            function printStar1(){
                for(var i=1;i<=5;i++){
                    var str="";
                    //输出空格
                    for(var j=1;j<=5-i;j++){
                        str +=" ";
                    }
                    //输出 *
                    for(var k=1;k<=i;k++){
                        str +="*";
                    }
                    console.log(str);
                }
            }
        </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值