js循环控制语句

160 阅读4分钟

循环控制语句

概述

循环控制语句是对应的控制语句中控制对应的代码重复执行的一个语句。它主要的作用是重复执行一段代码。

循环控制需要避免死循环,死循环会导致内存溢出(卡死)。

循环控制语句的分类

  • while
  • do while
  • for

循环控制语句的三要素

  • 初始值
  • 循环条件
  • 迭代值

while循环

基础的while
//声明一个初始值
var 初始值 = 值
while(循环条件(跟初始值相关)){
	循环体 (需要重复执行的代码)
	迭代值
}
示例

打印1-100的值

//声明初始值
var i = 1
//进入循环
while(i<=100){
	//需要执行的代码
	console.log(i)
	//迭代
	i++
}
练习

打印1-100之间的偶数

//声明初始值
var i = 1
//进入循环
while(i<=100){
	//需要执行的代码
	if(i%2==0){
	 console.log(i)
	}
	//迭代
	i++
}

打印1-50内3的倍数

var i = 1
while(i<=50){
	if(i%3 == 0){
		console.log(i)
	}
	i++
}

打印1-100内的即是7的倍数又是3的倍数的值

//声明初始值
var i = 1
//进入循环
while(i<=100){
	//需要执行的代码
	if(i%3==0 && i%7==0){
	 console.log(i)
	}
	//迭代
	i++
}

打印1-100之间的和

var i = 1
var sum = 0
//从1数到100
while(i<=100){
	//将数值加到sum中
	sum += i
	i++
}
//打印结果
console.log(sum)

打印5的阶乘

var i = 1
//接收乘积的结果
var result = 1
while(i<5){
	i++
	//阶乘操作
	result *= i
}

do while

基础使用
var 初始值 = 值
do{
	循环体
	迭代量
}while(循环条件)
示例

打印1-100

var i = 1
do{
	console.log(i)
	i++
}while(i<=100)

叫号系统

do{
  var i = prompt('请输入你需要叫的号')
  if(i == 1){
  	console.log('一号技师为你服务')
  }else  if(i == 2){
  	console.log('2号技师为你服务')
  }else if(i == 88){
  	console.log('88号技师为你服务')
  }else{
  	console.log('当前技师不在家')
  }
}while(i != 1 && i != 2 && i != 88)
while和do while的区别
  • while是先判断后执行
  • do while是先执行后判断 (最少执行一次)
练习

打印1-100内所有的3的倍数和5的倍数

var i = 1
do{
	if(i%3==0 || i%5==0){
		console.log(i)
	}
	i++
}while(i<=100)

打印1-20内 5的倍数的乘积

var i = 1
var result = 1
do{
	if(i%5==0){
		result *= i
	}
	i++
}while(i<=20)
console.log(result)

for

基本使用
for(初始值;循环条件;迭代量){
	循环体
}
示例

打印1-100的和

var sum = 0
for(var i=1;i<=100;i++){
	sum += i
}
console.log(sum)

打印1-100之间的偶数和

var sum = 2
for(var i=1;i<=100;i++){
	//判断是否为偶数
	if(i%2==0){
		sum += i
	}
}
console.log(sum)

打印1-100之间里面有3的或者是3的倍数的和

var sum = 0,a,b
for(var i = 1;i<=100;i++){
	//得到个位和十位
	a = i % 10 //个位
	b = parseInt(i / 10) //十位
	if(a == 3 || b == 3 || i % 3 == 0){
		sum += i
	}
}
console.log(sum)

for(;;) 也为for循环 死循环

循环嵌套

任意循环可以互相嵌套 (for循环可以嵌套while 和 dowhile 及 for ...),嵌套可以多层,一般建议最多嵌套俩层(效率)。

for(初始值;循环条件;迭代量){
	for(初始值;循环条件;迭代量){
		循环体
        .....
	}
}
示例
//外层循环执行5次
for(var i=0;i<5;i++){
    //内存循环执行5次
	for(var j = 0;j<5;j++){
		console.log('hello') //打印25次
	}
}

内层循环中内容的执行次数 = 外层循环次数 * 内层循环次数

打印乘法口诀表

//外层打印行
for(var i=1;i<=9;i++){
	//内层打印列 (多少行打印多少列)
	for(var j=1;j<=i;j++){
		//把内容写到页面上
		document.write(`${i} * ${j} = ${i*j} \t`)
	}
	//换行
	document.write('<br/>')
}
练习

打印1-100内的素数 (除了自身和1没有能整除的数)

//外层循环先遍历1-100
var count
for(var i=1;i<100;i++){
	//每次都初始化count
	count = 0 
	//声明变量记录能被整除的数的数量
	//遍历需要被除的数
	for(var j=1;j<=i;j++){
		//判断是否能被整除
		if(i % j == 0){
			count ++
		}
	}
	//等除完以后 如果能被整除只有俩个证明它是素数
	if(count == 2){
		console.log(i)
	}
}

打印直角三角形

/*
*
**
***
****
*/
//外层的行
for (var i = 0; i < 4; i++) {
    //里层的列
    for (var j = 0; j <= i; j++) {
        document.write('*')
    }
    //打印换行
    document.write('<br/>')
}
//控制台打印
for (var i = 0; i < 4; i++) {
    var str = ''
    //里层的列
    for (var j = 0; j <= i; j++) {
        str += '*'
    }
    //打印换行
    console.log(str)
}

打印等腰三角形

/*
	* 
   ***
  *****
 *******
*********
*/
//行
for(var i=0;i<5;i++){
    //打印空格
    for(var j=0;j<4-i;j++){
        document.write("&nbsp;")
    }
    //打印*
    for(var k=0;k< 2*i+1;k++){
        document.write("*")
    }
    //换行
    document.write("<br/>")
}
//控制台打印
for (var i = 0; i < 5; i++) {
    var str = ''
    //打印空格
    for (var j = 0; j < 4 - i; j++) {
        str += ' '
    }
    //打印*
    for (var k = 0; k < 2 * i + 1; k++) {
        str += '*'
    }
    //换行
    console.log(str)
}

打印1-100之间的奇数每行打印三个

//遍历1-100
//第二种方式
var count = 0 //计数
var str = '' //存奇数值
for (var i = 1; i < 100; i++) {
    //判断是否为奇数
    if (i % 2) {
        count++ //计数器+1
        str += i + '\t' //存值
        if (count % 3 == 0 && count != 0) {
            //满足三个换行
            str += '\n'
        }
    }
}
console.log(str)
//页面打印
var count = 0 //计数
var str = '' //存奇数值
for (var i = 1; i < 100; i++) {
    //判断是否为奇数
    if (i % 2) {
        count++ //计数器+1
        str += i + '\t' //存值
        if (count % 3 == 0 && count != 0) {
            //满足三个换行
            str += '<br/>'
        }
    }
}
document.write(str)

打印100-1000内的水仙花数 (个位的三次方 + 十位的三次方 + 百位的三次方 = 本身 153)

//遍历100 - 1000
for(var i=100;i<1000;i++){
	//得到个十百位
	var a = i%10
	var b = parseInt(i%100/10)
	var c = parseInt(i/100)
	if(Math.pow(a,3)+Math.pow(b,3)+Math.pow(c,3) == i){
		console.log(i)
	}
}

打印96 和 65的最大公因数 和 最小公倍数 (6和9的最大公因数 3 最小公倍数 18)

//先取俩个数之间的最大值
var first = 96
var last = 65
//判断俩个值的大小 (最大公因数一定小于或等于最小值(大于或等于1) 最小公倍数一定大于或等于最大的值 (小于俩个数的乘积))
var min = first>last?last:first
var max = first<last?last:first
//最小公倍数
//取值区间
for(var i = max;i<=first*last;i++){
	//判断 是否能整除俩个数
	if(i%first == 0 && i%last == 0){
		console.log('最小公倍数为'+i)
		//退出 break可以跳出当前的循环 也可以跳出switch
		break;
	}
}
//最大公因数
for(var i=min;i>=1;i--){
	if(first % i ==0 && last % i ==0){
		console.log('最大公因数'+i)
		//退出
		break
	}
}

打印菱形

/*
   *
  ***
 *****
*******
 *****
  ***
   *
*/
//打印行
for(var i=0;i<7;i++){
    //保存所有的内容
    var str = ''
    //上半部分
    if(i<4){
        //打印空格
        for(var j=0;j<3-i;j++){
            str += ' '
        }
        //打印*
        for(var j=0;j<2*i+1;j++){
            str += '*'
        }
    }else{//下半部分
        //打印空格
        for(var j=0;j<i-3;j++){
            str += ' '
        }
        //打印*
        for(var j=0;j<(7-i)*2-1;j++){
            str += '*'
        }
    }
    //换行打印
    console.log(str)
}

循环中的关键词

  • break 跳出循环 (跳出switch块)
  • continue 跳过本次循环
示例
//break 0 1 2 3 4
for(var i=0;i<10;i++){
    if(i==5){
        break //break执行 跳出当前的for循环
    }
    console.log(i)
}
//continue 0 1 2 3 4 6 7 8 9
for(var i=0;i<10;i++){
    if(i==5){
        continue //continue会跳过本次循环 本次循环的后续代码不再执行 但是下一次循环继续执行
    }
    console.log(i)
}

打印1-100之间的数(逢7过)

for(var i=1;i<100;i++){
	//拿到对应的个位和十位
	var a = i%10
	var b = parseInt(i/10)
	//判断个位为7或者十位为7以及是7的倍数
	if(a==7 || b==7 || i%7==0){
		continue
	}
    console.log(i)
}

找到1-20之间 既是2的倍数又是3的倍数的第一个值

for(var i=1;i<20;i++){
	if(i%2==0 && i%3==0){
		console.log(i)
		break
	}
}

循环总结

  • 循环主要做的是反复执行一段代码,它必须要具备三要素 初始值、 迭代量、 循环条件。
  • 循环需要避免死循环,死循环会导致内存溢出。
  • 任意循环之间可以互相嵌套,一般建议最多嵌套俩层(嵌套越多效率越低)
  • dowhile最少执行一次(先执行后判断)
  • while循环的时间复杂度低于for循环
  • break是用于跳出当前循环,continue是用于跳过本次开启下一次。
  • while及for死循环写法
//while循环
while(true){
	
}
//for循环
for(;;){

}

复杂度

复杂度是属于数据结构思想中的一个衡量对应的性能和效率的单位。主要划分为俩块分别为时间复杂度和空间复杂度。

时间复杂度

在恒定的机器环境的运行时间和执行次数的比例称为时间复杂度。时间复杂度主要用于衡量对应的执行速度。一般用O表示。

时间复杂度划分
常数阶 O1
console.log('hello world') //执行一次
线性阶 On
for(var i=0;i<n;i++){
	console.log('hello world') //执行n次
}
对数阶 Ologn
var i = 1  
while(i<n){
	i *= k//执行次数 n的k次方根
}
线性对数阶 Onlogn
for(var i=0;i<n;i++){
    var i = 1  
    while(i<n){
        i *= k//执行次数 n的k次方根 * n
    }
}
平方阶 On^2
for(var i=0;i<n;i++){
    for(var i=0;i<n;i++){
        console.log('hello world') //执行n * n次
    }
}
立方阶 On^3
for(var i=0;i<n;i++){
    for(var i=0;i<n;i++){
        for(var i=0;i<n;i++){
            for(var i=0;i<n;i++){
                console.log('hello world') //执行n的立法次
            }
        }
    }
}
k次方阶 On^k

...

时间复杂度的优先级 (越低的越好)

O1 < Ologn < On < OnLogn < On^2 < On^3 < On^k ...

空间复杂度

在恒定的机器环境内容运行代码开启的内存(开启的内存)和对应的空间的比例。主要衡量对应的内存消耗。