概述:
循环控制语句 根据对应的条件来控制对应的代码片段的执行次数(多次执行 循环执行),常用的循环控制语句while do while for...循环是重复执行多次代码所以对应的执行次数是可以计算的,那么对应的执行次数和对应的条件判断中的相关条件的一个关系是事件复杂度(时间复杂度是用于区分效率的他是用来优化程序的).然后对应的循环在书写过程中我们需要尽可能的避免死循环(无线循环).
循环三要素
初始值 初始的变量值
迭代量 基于初始值的变化
判断条件 对应的执行循环中代码的条件
常用的循环语句
while循环
do while 循环
for 循环
while循环
var变量=初始值
while(条件表达式){
执行的代码(循环体)
迭代
}
示例
//循环打印操作10遍
vari=0
//当我出现死循环的时候 在浏览器执行了打印操作 你会发现我不能进行其他的操作
//原因是JavaScript是一个单线程脚本语音
while(i<0){
i++//迭代量
console.log("hello world"+i)
}
练习
计算1-100的和
vari=0//初始值
varsum=0//用于储存和的变量
while(i<100){
i++//迭代量变化
sum+=i//将对应遍历的值加给对应的和
}
console.log(sum)
计算1-100的阶乘
vari=0
varresult=1
while(i<100){
i++
result*=i
}
console.log(result)
计算1-100种奇数的阶乘
vari=0
varresult=1
while(i<100){
i++
//判断是不是奇书
if(i%2!=0){
result*=i
}
}
do while
var 变量=初始值
do{
迭代量
循环体
}while(条件)
特点:先做后判断 最少执行一次
示例
//打印100遍 hello world
vari=0
do{
console.log("hello world")
i++
}while(i<100)
console.log(sum)
计算100-1000的水仙花数之和 153 1的三次方+5的三次方+3的三次方 == 本身的(153)每位的三次方
的和等于本身就是水仙花数
vari=100
varsum=0
do{
//获取对应的i值个数 十位 和百位 进行对应的判断
vara=i%10
varb=parseInt(i/10)%10
varc=parseInt(i/100)
//判断是否为水仙花数
if(Math.pow(a,3)+Math.pow(b,3)+Math.pow(c,3)==i) {
console.log(i)
sum+=i
}
i++
}while(i<1000)
console.log(sum)
do while 和while以及使用场景
do while 是先执行后判断 最少执行一次 (常用于人机交互)
while 是先判断后执行 最少执行0次(对应的循环处理)
猜拳游戏
<script>
varrandoms=parseInt(Math.random()*3)
do{
varuser=prompt("输入0剪刀,输入1石头,输入2步")
if(user!=0&&user!=1&&user!=2) {
console.log("输入错误");
}elseif(randoms==0&&user==2||randoms==1&&user==0||randoms==2&&user==1) {
console.log("你赢了");
}else{
console.log("你输了");
}
}while(user!=0&&user!=1&&user!=2)
</script>
for
for 循环跟while之间可以互相转换也就是说他们对应的运行过程是一样的
for(初始值;条件判断;迭代量){
循环体
}
示例
for(vari=1;i<=100;i++){
console.log(i)
}
console.log(i)
面试题
for(;;)是正确的,但是他是死循环
练习
打印五个❤
for(vari=0;i<5;i++){
console.log("❤")
}
计算1-5的阶乘
varresulet=1
for(vari=1;i<=5;i++){
resulet*=i
}
console.log(result)
循环嵌套
所有的循环都可以进行嵌套 不痛循环之间可以相互嵌套
for循环嵌套for循环 while循环嵌套while循环
for循环嵌套while循环等等.....都可以实现
嵌套在最里面的那个循环执行的次数是所有循环的次数的乘积
练习
打印1-100内所有的质数(除1和本身没有其他的数可以整除)
for(vari=2;i<=100;i++) {
varcount=0
for(varj=2;j<i-1;j++) {
if(i%j==0) {
count++;
}
}
if(!count) {
console.log(i);
}
}
输入两个数值 求出他们的最小拱北数和最大公约数
vara=prompt("")
varb=prompt("")
varmin=a*b
for(vari=a*b;i>1;i--) {
if(i%a==0&&i%b==0) {
min=i
}
}
console.log(min);
varmax=1
varvalue=a>b?b:a;
for(vari=1;i<value;i++) {
if(a%i==0&&b%i==0) {
max=i
}
}
console.log(max);
break 和continue
break是用于跳出, 他可以结束对应的循环快.
contlue是用于结束当前正在循环的循环(只会中断当前判断条件的循环次数)
bereak示例
for(var i=1;i<5;i++){
if(i%2==0){
break//结束了当前的循环
}
console.log(i)//1
}
continue示例
for(var i=1;i<5;i++){
if(i%2==0){
continue//跳过了当前的循环进入下一次
}
console.log(i)//1
}
练习
打印以下图形
*
***
*****
*******
for(vari=0;i<4;i++) {
for(varj=0;j<2*i+1;j++) {
document.write("*");
}
document.write(" <br/>");
}
*
***
*****
*******
for(vari=0;i<4;i++){
varline=""
for(vark=0;k<3-i;k++){
line+=" "
}
for(varj=0;j<2*i+1;j++){
line+="*"
}
document.write(line+"<br/>")
}
50-100之间 跳过所有的里面带7的和7的倍数 将其他的全部打印
for(vari=50;i<100;i++){
if(parseInt(i/10)==?i%10==7||i%7==0){
continue
}
console.log(i)
}
扩展内容(时间复杂度)
时间复杂度概述
在恒定的环境内,他的执行次数和对应的变量的比列构成的值为时间复杂度。时间复杂度是在一定程度
上表示当前的程序的运行速度,时间复杂度越低那么运行速度就越快。还有一个就是我们需要考虑的空
间复杂度,空间复杂度是指你的程序在运行的时候开辟的内存大小,空间复杂度越低占用的内存就越少
(内存不再优先考虑)
时间复杂度的分类及示例
时间复杂度使用字母O来表示 他的对应分类和其执行次数的比列是相关的
O(1) 常数阶
console.log("hello world")//一切没有变量来控制的 只执行一次的代码他属于常数阶o(1)
O(logn)对数阶
//2 * 2 * 2 100-10求二的对数 log2(n-m) O(logn)
varm=10
varn=100
vark=2
while(m>n){
m*=k;
console.log("hello")
}
O(n)线性阶
for(vari=0;i<n;i++){
console.log("hello world")
}
O(nlogn)线性对数阶
for(vari=0;i<n;i++){
varm=10
varn=100
vark=2
while(m>n){
m*=k;
console.log("hello")
})
}
O(n平方)平方阶
for(vari=0;i<n;i++){
for(varj=0;j<n;j++){
console.log("hello world")
}
}
O(n的立方)立方阶
for(vari=0;i<n;i++){
for(varj=0;j<n;j++){
for(varj=0;j<n;j++){
console.log("hello world")
}
}
}
O(n的k次方)k次方阶
总结
从上可得 循环嵌套不会超过俩次!从对应得时间复杂度来看 我们可以得到logn和n是比较性常用得 我
们发现logn是比n要快得,所以在后续得优化中我们采用logn级别得时间复杂度来替代n。对于for循环
和while循环 对应得时间复杂度来说while要快于for循环,用while来替代for循环