循環(huán)的概念
重復(fù)的執(zhí)行一段的代碼,避免死循環(huán),提高效率(時(shí)間復(fù)雜度(關(guān)注) 空間復(fù)雜度(不關(guān)注)),循環(huán)
包含三大語(yǔ)句。while語(yǔ)句,do while語(yǔ)句,for語(yǔ)句
循環(huán)的三要素
初始值(初始的變量值)
迭代量 (基于初始值的改變)
條件 (基于初始值的判斷)
while語(yǔ)句
while(條件表達(dá)式(返回true和false)){
執(zhí)行的代碼
}
var 初始值變量 = 值
while(條件){
迭代量
執(zhí)行的代碼
}
示例 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 (對(duì)應(yīng)的while唯一的區(qū)別是先做 后判斷 意味最少走一次)
var 初始值 = 值
do{
執(zhí)行的代碼
迭代量變化
}while(條件)
示例
1+2+...+100
var i = 0
var sum = 0
do{
i++
sum+=i
}while(i<100)
while和do while區(qū)別
- while是先判斷后執(zhí)行 do while 先執(zhí)行后判斷
- do while最少執(zhí)行一次 while最少執(zhí)行0次
- 常用while來(lái)寫一些執(zhí)行多次的內(nèi)容 (最少?zèng)]規(guī)定) do while(規(guī)定必須要執(zhí)行的時(shí)候)
for循環(huán)(常用,但是時(shí)間復(fù)雜度比while高)
for(初始值;條件;迭代量){
//執(zhí)行的代碼 跟if一樣如果你執(zhí)行的代碼只有情況下可以省略{}
}
示例
1+2+...+100
var sum = 0
for(var i=0;i<=100;i++){
sum += i
}
注意:for( ;;)這樣寫沒有錯(cuò),對(duì)應(yīng)的里面的內(nèi)容可以被省略,但這是一個(gè)死循環(huán),因?yàn)闆]有條件和迭代量
時(shí)間復(fù)雜度(判斷內(nèi)容執(zhí)行效率 依照次數(shù)計(jì)算)!?。?/h5>
概述:從傳統(tǒng)意義上 對(duì)應(yīng)的代碼時(shí)間復(fù)雜度越低對(duì)應(yīng)的執(zhí)行速度越快(效率越高)
例:
O(1) (每行只執(zhí)行一遍 常數(shù)階)
var i = 0
i++
if(i<10){
console.log(i)
}
O(logN) (倆個(gè)值來(lái)決定 對(duì)數(shù)階)
var i = 1 //由i和2決定
while(i<100){
i*=2
}
O(n) (由對(duì)應(yīng)的一個(gè)值決定的 線性階)
for(var i=0;i<100;i++){
console.log('我執(zhí)行了'+i+'遍')
}
O(nlogn) (循環(huán)嵌套對(duì)應(yīng)的對(duì)數(shù)階循環(huán) 線性對(duì)數(shù)階)
for(var i=0;i<100;i++){
var j = 1 //由i和2決定
while(j<100){
j*=2
}
}
O(n^2) (雙層循環(huán)嵌套 平方階)
for(var i=0;i<100;i++){
for(var j=0;j<100;j++){
console.log('我執(zhí)行了'+j+'遍')
}
}
時(shí)間復(fù)雜度:O(1) < O(logN) <O(n)<O(nlogn)<O(n^2) ?。?!
循環(huán)嵌套(將多個(gè)循環(huán)嵌套在一起)
/*
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
* * * * * * * * * *
*/
//外層控制行,內(nèi)層控制列
var i = 0;
while(i<4){
i++;
var j = 0;
var str = " "http://拼接作用
while (j<10){
j++
str+='*'
}
document.write(str+"<br/>")
}
break
break 跳出代碼塊 (switch 以及 循環(huán)中) 只會(huì)跳出當(dāng)前break所在層的循環(huán)(這個(gè)循環(huán)會(huì)被結(jié)束)
例
// 1, 判斷一個(gè)數(shù)是不是合數(shù)。(指自然數(shù)中除了能被1和本身整除外,還能被其他的數(shù)整除(不包括0)數(shù)。)
var number = prompt()
//判斷是否他有可以被除自身和1之外整除的數(shù)
for(var i=2;i<number;i++){
if(number%i==0){
console.log("當(dāng)前數(shù)為合數(shù)");
break;
}
}
// 2, 判斷一個(gè)數(shù)是不是素?cái)?shù)。(除了1和它本身以外不再有其他的除數(shù)整除。)
//得到個(gè)數(shù)
var count = 0
for(var i=2;i<number;i++){
if(number%i==0){
count ++
break;
}
}
if(count==0){
console.log('當(dāng)前值為素?cái)?shù)');
}
continue
continue 跳過(guò)本次循環(huán)(只能在循環(huán)內(nèi)使用)循環(huán)還在繼續(xù)
// 1,求整數(shù)1~100的累加值,但要求跳過(guò)所有個(gè)位為3的數(shù)。
var sum = 0 //接收對(duì)應(yīng)的累加值
for(var i=1;i<=100;i++){
if(i%10==3){
continue //遇到continue跳過(guò)本次開始下一次循環(huán)
}
sum+=i
}
console.log(sum);