十九、while()循环

十九、while()循环

19.1 whiledo……while的执行机理

while的循环机理:首先要判断表达式是否是真,如果是真,就执行循环体。执行一次之后再看表达式是否是真,如果是真,就再执行…………直到表达式为假。

UCesqU.png

do……while的循环机理:第一次执行do{ }里面的语句,不需要满足条件。然后满足while的条件就继续执行下去

UCeRi9.png

while循环输出1~100:

写法1:

1
2
3
4
5
6
7
<script>
var i = 1;
while(i <= 100){
console.log(i); // 输出1~100
i++;
}
</script>

循环体中必须自己写i的改变量。for循环有for(;;i++){}结构,while没有,需要自己写。

必须要使i有朝一日,不满足i<100,循环越走越趋向终点。

写法2:

1
2
3
4
5
6
<script>
var i = 1;
while(i <= 100){
console.log(i++); // 输出1~100
}
</script>

写法3:

1
2
3
4
5
6
<script>
var i = 1;
while(i++ <= 100){
console.log(i); // 输出2~101
}
</script>

写法4:

1
2
3
4
5
6
<script>
var i = 1;
while(++i <= 100){
console.log(i); // 输出2~100
}
</script>

写法5:

1
2
3
4
5
<script>
var i = 100;
while(i--){ // 0判断为非,到0自动停止
console.log(i); //输出99~0
}

写法6:

1
2
3
4
5
<script>
var i = 100;
while(--i){
console.log(i); // 输出99~1
}

写法7:

1
2
3
4
5
6
<script>
var i = 1;
do{
console.log(i); // 先做一次再判断 输出1~101
}while(i++ <=100);
</script>

写法8:

1
2
3
4
5
6
7
<script>
var i = 1;
do{
console.log(i); // 先做一次再判断 输出1~100
i++;
}while(i <=100);
</script>

写法9:

1
2
3
4
5
6
7
<script>
var i = 1;
do{
i++;
console.log(i); // 先做一次再判断 输出:2~101
}while(i <=100);
</script>

写法10:

1
2
3
4
5
6
<script>
var i = 1;
do{
console.log(i++); // 先做一次再判断 输出1~100
}while(i <=100);
</script>

写法11:

1
2
3
4
5
6
7
<script>
var i = 1;
while(true){
console.log(i); // 输出1~100
if(++i > 100) break;
}
</script>

故意写成死循环,然后大于了100,那么结束死循环。

注意,通过上面的例子,发现while不擅长做“有明确卡两头”的问题,因为这样非常容易犯“出1”错误,要么多一个,要么少一个。

19.2 while常用在何处(卡量不卡端点)

while擅长什么?

1
2
3
① 限制结果个数,比如找十个质数;找3个水仙花数;找6个完美数
② 找最小的,比如找最小的质数
③ 随机数最值的验收,比如随机两个数字不能都是0

例1:寻找前10位质数

找数量,满足几个,就累加,两个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<script>
// 现在已经找到几个了
var number = 0;
// 现在已经验证到数字几了,第一个质数是2
var n = 2;
while(number < 10){
// 判断n是不是质数
for(var i = 2 ; i < n ; i++){
if(n % i == 0){
break; //一旦 n能被>=2的数字整除时,说明n不是质数
}
}
// 看i怎么出循环的。如果i和n相等,说明i是自然出循环的,是质数
// 如果i和n不相等,说明是被break赶出来的,就不输出
if(i == n){
console.log(n);
// 计数器加1
number++;
}
n++;
}
</script>

UCmdTe.png

还可写为死循环的方式,当找到前10个数后结束循环:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script>
// 现在已经找到几个了
var number = 0;
// 现在已经验证到数字几了,第一个质数是2
var n = 2;
while(true){
// 判断n是不是质数
for(var i = 2 ; i < n ; i++){
if(n % i == 0){
break; //一旦 n能被>=2的数字整除时,说明n不是质数
}
}
// 看i怎么出循环的。如果i和n相等,说明i是自然出循环的,是质数
// 如果i和n不相等,说明是被break赶出来的,就不输出
if(i == n){
console.log(n);
// 计数器加1
number++;
if(number == 10){
break;
}
}
// 让下一个数字来检查,开始检查3 4 5 6 ……
n++;
}
</script>

例2:寻找最小的既能被3整除,也能被5整除的数:

找最小,while(true){},写死循环,满足一个条件就break

拧巴的写法:

1
2
3
4
5
6
7
<script>
var n = 1;
while(!(n % 3 ==0 && n % 5 ==0)){ //当n不能满足(n % 3 ==0 && n % 5 ==0)时,n继续自增
n++;
}
console.log(n); // 输出15
</script>

正确的写法:

1
2
3
4
5
6
7
8
9
10
<script>
var n = 1;
while(true){
if(n % 3 ==0 && n % 5 ==0){
console.log(n); // 输出15
break;
}
n++;
}
</script>

例3:随机两个-3到3的数字,不能都是0

应用:

do{
}while()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
// 随机产生的a和b不能都是0
do{
var a = parseInt(Math.random() * 7) - 3;
var b = parseInt(Math.random() * 7) - 3;
}while(a == 0 && b == 0); // 先执行随机产生a b ,当a b 都为0时就一直循环,保证出来的 a 不都是0

console.log(a, b);
</script>

<script>
do{var a = parseInt(Math.random() * 10000);
}while(a != 666); // 先执行随机产生a ,当a 不是666的时候就一直循环,所以出来的a一定是666

console.log(a); // a 值一定是666
</script>

关于随机数Math.random()

产生一个0~1之间的随机数。注意取的数字肯定不是0,也不是1.也就是说(0,1)开区间

UCnp11.png

这个随机数可以放大一个倍数:

1
Math.random() * 8          // 0点几到7点几

UCnEAe.png

关于取整:parseInt(Math.random() * 8)

1
parseInt(Math.random() * 8)          // 0 1 2 3 4 5 6 7

UCnm9A.png

还可以加上一个常数:

1
parseInt(Math.random() * 8) + 3            // 3 4 5 6 7 8 9 10

得到一个公式:

1
2
3
想要在`[a,b]`闭区间内随机一个整数,应该写:

parseInt(Math.random() * (b – a + 1)) + a;

比如,想要随机得到33 34 35 36 四个值中的任意值:

1
parseInt(Math.random() * 4) + 33;

比如,想要随机得到5 6 7 8 四个值中的任意值:

1
parseInt(Math.random() * 4) + 5;

比如,想要随机得到-3 -2 -1 0 1 2 3 七个值中的任意值:

1
parseInt(Math.random() * 7) - 3;

19.3 while循环转为for循环

1
2
3
4
5
while(abc){ } 

↓↓↓

for() ;abc ; ){ }
点击查看

本文标题:十九、while()循环

文章作者:Mango

发布时间:2020年07月08日 - 21:52:27

最后更新:2020年07月08日 - 22:35:39

原始链接:https://mango185.github.io/post/f49b500.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------