循环的概念
重复的执行一段的代码,避免死循环,提高效率(时间复杂度(主要关注) 空间复杂度(不关注)),循环包含三大语句:while语句、do while语句、for语句。
循环的三要素
- 初始值(初始的变量值)
- 迭代量(基于初始值的变化)
- 条件(基于初始值的判断)
while语句
while(条件表达式(返回true和false)){ 执行的代码 } var 初始值变量 = 值 while(条件){ 迭代量 执行的代码 }
eg:(循环打印1~10)
var i = 1 while(i<=10){ console.log(i) i++ }
eg:(1+2+…+100)
// 1加到100 var number = 0 var sum = 0 while(number<100){ number++ sum += number } console.log(sum); //100加到1 var i = 100 sum = 0 while(i>=1){ sum += i i-- }
console.log(sum);
do while (与while唯一的区别是先做 后判断 (说明至少走了一次))
do{ 执行的代码 }while(条件)
var 初始值 = 值 do{ 执行的代码 迭代量变化 }while(条件)
eg:上厕所
var isEmpty = true do{ console.log('有人不') isEmpty = false }while(isEmpty)
eg:1+2+…+100
var i = 0 var sum = 0 do{ i++ sum+=i }while(i<100)
while和do while的区别:
- while是先判断后执行 do while是先执行后判断
- do while最少执行一次 while最少执行0次
- 常用while来写一些执行多次的内容,且最少执行次数没规定时 do while(规定必须要执行的时候)
for循环(最常用的)
for(初始值;条件;迭代量){ //执行的代码 跟if一样如果你执行的代码只有情况下可以省略{} }
eg:1+2+…+100
var sum = 0 for(var i=0;i<=100;i++){ sum += i }
***面试题:for(;;)是错误的吗?(没错!!!也就意味对应的内容可以被省略)
for(;;){ console.log('hello') } //死循环 省略迭代量 和 条件 必定是死循环 var i = 0 for(;i<100;i++){ console.log('我执行了'+i+'遍') } console.log(i)//100
时间复杂度(判断内容执行效率 依照次数计算)
概述:从传统意义上 对应的代码时间复杂度越低对应的执行速度越快(效率越高)
O(1) (每行只执行一遍 常数阶)
var i = 0 i++ if(i<10){ console.log(i) }
O(logN) (俩个值来决定 对数阶)
var i = 1 //由i和2决定 while(i<100){ i*=2 }
O(n) (由对应的一个值决定的 线性阶)
for(var i=0;i<100;i++){ console.log('我执行了'+i+'遍') }
O(nlogn) (循环嵌套对应的对数阶循环 线性对数阶)
for(var i=0;i<100;i++){ var j = 1 //由i和2决定 while(j<100){ j*=2 } }
O(n^2) (双层循环嵌套 平方阶)
for(var i=0;i<100;i++){ for(var j=0;j<100;j++){ console.log('我执行了'+j+'遍') } }
时间复杂度 O(1) < O(logN) <O(n)<O(nlogn)<O(n^2)
while的时间复杂度低于for循环 (算法的优化可以使用while来替代for)
循环嵌套(将多个循环嵌套在一起)
eg:打印一个正方形
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ //外层控制行 内层循环控制列 var row = 4 var col = 10 for(var i=0;i<row;i++){ var j = 0 //每行的字符串 var rowStr = "" while(j<col){ j++ //字符串拼接 rowStr+='*' } document.write(rowStr+"<br/>") } //执行次数 外层循环次数*内层循环次数
循环嵌套最多套俩层 O(n^2)
eg:
for(var i=0;i<5;i++){ //内层的循环条件依赖于外层 var str = '' for(var j=0;j<=i;j++){ str += '*' } document.write(str+"<br/>") }
break
break 跳出代码块 (switch 以及 循环中) 只会跳出当前break所在层的循环(这个循环会被结束)
eg:
// 1, 判断一个数是不是合数。(指自然数中除了能被1和本身整除外,还能被其他的数整除(不包括0)的数。) var number = prompt() //判断是否他有可以被除自身和1之外整除的数 for(var i=2;i<number;i++){ if(number%i==0){ console.log("当前数为合数"); break; } } // 2, 判断一个数是不是素数。(除了1和它本身以外不再有其他的除数整除。) //得到个数 var count = 0 for(var i=2;i<number;i++){ if(number%i==0){ count ++ break; } } if(count==0){ console.log('当前值为素数'); }
continue
continue 跳过本次循环(只能在循环内使用)循环还在继续
// 1,求整数1~100的累加值,但要求跳过所有个位为3的数。 var sum = 0 //接收对应的累加值 for(var i=1;i<=100;i++){ if(i%10==3){ continue //遇到continue跳过本次开始下一次循环 } sum+=i } console.log(sum);
关于循环的各种题:
// 1, 一个新入职,月工资为2000元的员工,每年涨当年工资5%,20年后的月工资是多少? var money = 2000 for(var num = 0;num < 20;num++){ money *= 1 + 0.05 } money = parseInt(money) console.log('20年后的月工资是' + money); //2, 山上有一口缸可以装50升水,现在有15升水。老和尚叫小和尚下山挑水,每次可以挑5升。问:小和尚要挑几次水才可以把水缸挑满?通过编程解决这个问题。 // var num = 5 var cishu = 0 for(var start = 0;start < 35;start += 5){ cishu++ } console.log(cishu); // 3, 打印100–200之间所有能被3或者7整除的数 for(var a = 100;a <= 200;a++){ if(a % 3 == 0 || a % 7 == 0){ console.log(a); } } // 4, 计算10的阶乘 (1*2*3*4*5*6*7*8*9*10 n的阶乘1*2……*n) var sum = 1 for(var a = 1;a <= 10;a++){ sum *=a } console.log(sum); // 5, 计算1+3+5+...+99的和 var sum = 0 for(a = 1;a <= 100;a++){ if(a % 2 != 0){ sum += a } } console.log(sum); // 6, 99乘法表
var row = 9 var col = 9 for(var i = 1;i <= row;i++){ sum = 0 for(var j = 1;j <= i;j++){ sum = i * j // console.log(i+'x'+j+'='+sum) document.write(j+'x'+i+'='+sum+' ') } document.write('<br/>') } var row = 9 var col = 9 for(var i = 1;i <= row;i++){ // sum = 0 str = '' for(var j = 1;j <= i;j++){ // sum = i * j // console.log(i+'x'+j+'='+sum) // document.write(j+'x'+i+'='+sum+' ') str += j + 'x' + i + '=' + (i * j) + ' ' } console.log(str); // document.write('<br/>') } // 7, 输出20~80之间能被3整除的整数, 每行5个 var a = 0 for(i = 20; i <= 80;i++){ if(i % 3 == 0){ document.write(i + ' ') // console.log(i); a++ } if(a % 5 ==0){ document.write('<br/>') } } // 打印的方法 var a = 0 var srt = '' for(i = 20; i <= 80;i++){ if(i % 3 == 0){ // document.write(i + ' ') // console.log(i); srt += i + '/t' a++ } // console.log(srt); if(a % 5 ==0){ // document.write('<br/>') srt += '/n' } } console.log(srt); // 8, 打印1000~2000年中所有的闰年, 每行4个 var a = 0 for(i = 1000;i <= 2000;i++){ if(i % 4 ==0 && i % 100 !=0 || i % 400 == 0){ document.write(i + ' ') a++ } if(a % 4 == 0){ document.write('<br/>') } } //打印 str = '' var a = 0 for(i = 1000;i <= 2000;i++){ if(i % 4 ==0 && i % 100 !=0 || i % 400 == 0){ // document.write(i + ' ') str += i + ' ' a++ } if(a % 4 == 0){ // document.write('<br/>') str += '/n' } } console.log(str); // 9, 求: 1-1/2+1/3-1/4 … 1/100的和 var sum = 0 var sum1 = 0 var sum2 = 0 for(i = 1;i <= 100;i++){ if(i % 2 != 0){ sum1 += 1 / i } if(i % 2 == 0){ sum2 -= 1 / i } sum = sum1 + sum2 } console.log(sum); // 输入两个数,求两个数的最小公倍数(****) // 如: 9和6的最小公倍数是18, // 1, 先找出两个数中的最大数 // 9 -> 6*9 // 2, 最大数++,找出能被两个数整除的数(退出循环) var a = prompt() var b = prompt() var c = 0 if(a > b){ c = a console.log('最大数为' + a); }else { console.log('最大数为' + b); c = b } while(c){ if(c % a == 0 && c % b == 0){ console.log('最小公倍数为'+ c); break } c++ } // 输入两个数n,a,如果n==3, a == 2; // 输出 2 + 22 + 222 的值。(不用输出式子)(****) // 如: n == 4, a == 3; // 输出 3 + 33 + 333 + 3333的值。 // 提示: 1、n = 3,相加三次,每次相加比前一次相加的数,多一位 // 2、每次多的这个位数的值为a, 3, 3*10+3(33), 33*10+3(333),... var n = prompt() var a = prompt() var sum = 0 var str = '' for(i = 0;i < n;i++){ str += a sum += Number(str) } console.log(sum); // 11, 五位数中,对称的数称为回文数,找出所有的回文数。 // 如: 12321 for(var i = 10000;i < 100000;i++){ var a = parseInt(i / 10000) var b = parseInt(i / 1000 % 10) var c = parseInt(i / 10 % 10) var d = parseInt(i % 10) if(a == d && b == c){ console.log(i); } } // 13, 求1!+2!+3!+4!+5! var sum = 0 for(var i = 1;i <= 5;i++){ var sum1=1 for(var j = 1;j <= i;j++){ sum1 *= j } sum += sum1 } console.log(sum); // 14, 找出所有的水仙花数,三位数,各位立方和等于该数本身。 // 如: 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3 for(var i = 100;i < 1000;i++){ var a = parseInt(i / 100) var b = parseInt(i / 10 % 10) var c = parseInt(i % 10) if(i == Math.pow(a,3) + Math.pow(b,3) + Math.pow(c,3)){ console.log(i); } } // 15, 输入任意两个数,如果第一个数小,从第一个数打印到第二个数,如果第二个数小,从第二个数打印到第一个数 var a = prompt() var b = prompt() if(a < b){ console.log(a + ' ' + b); }else{ console.log(b + ' ' + a); } // 16, 输入两个数,求两个数的最大公约数(*****) // 如: 12和8的最大公约数是4, // 提示: 能够同时整除两个数的最大数 // 1, 先找出两个数中最小的那个数, // 2, 最小数--, 找出能被两个数整除的数(退出循环break) var a = prompt() var b = prompt() var min = 0 a < b? min =a:min=b for(i = min;i > 0;i--){ if(a % i == 0 && b % i == 0){ console.log(i); break } }
原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/277377.html