详解程序中循环次数的判断

循环次数

#

前言

#

很多同学来问我循环体循环了几次到底该怎么判定?我打算今天给出一个通用的解决方案

下面我以VB与Python结合来解释

基础

#

首先一个循环体必须有的值

初始值

结束值

步长

条件

上面这4个是组成循环的必要条件,缺一不可,任何一个已知的循环体中我们都能够求出他们的值

解题的核心思想是找到最后一个满足循环条件的数(结束值)

那么如何寻找?

请你把循环看作是植树问题。

植树问题

#

假设现在我从第1米开始植树(初始值为1),每隔1米值1棵树(步长为1),我要求不能超过6米(条件为i≤6),那么我一共植了多少颗数(问循环了几次)

下面的T代表树Tree,X代表这个地方是空的

T T T T T T

0---1---2---3---4---5---6

上面的例子你一眼就可以看出来结束值为6,也就是最后一个满足这个条件的数是6

一共植了6颗树木,那么循环的次数就是6

对于比较简单的循环体,你一眼就能找出该数字

通用公式为(结束值-初始值)/步长,得到树木的间隔数(也就是树木之间有几个间隔),然后+1就是树木的数量(循环的次数)

所以公式就是循环次数=(结束值-初始值)/步长+1

如果更加复杂一些,步长不是1怎么办?

跳跃的步长

#

还是植树的例子

现在我改变条件,变成每隔3米值一棵树(步长为3),其他条件依然不变

T X X T X X

0---1---2---3---4---5---6

可以看到,只有第一米和第四米值了树,也就是说最后一个满足条件的数字是4

计算公式为

(4-1)/3+1=2

有人可能就要问了,有没有快速找到最后一个满足的值的方法?

快速找到结束值

#

比如来个复杂一点的例子

i=50

while(i>4):

i=i-3

比如这个例子,步长为-3,初始值为50,判定条件为i>4,很难一眼看出结束值,那么结束值如何寻找?

我们可以假设循环了X次刚好出现最后一个满足条件的值

首先,步长是3,也就是说我们假设从i=50开始,一直减少了3,总共减少了3X,最后剩下来的那个数i,刚好满足i>4,而且如果再多减少一次3(X+1),就刚好不满足i>4,也就是说i≤4

列出方程式就是

50-3X>4

50-3(X+1)≤4

#解得

14.3≤X<15.3

#X必须为整数

X=15

也就是说,循环了15下,刚好出现了结束值,结束值就是50-3x15=5

用这个方法算出的结束值准不会错

再代入回之前的万能公式循环次数=(结束值-初始值)/步长+1,那么就是

count=(5-50)/-3+1 #count=16

当然你也可以直接让循环次数=X+1,因为X刚好是树木的间隔

⚠️下面的方法是分类讨论,因为还有情况,就是判定条件中>和≥

如果你觉得列方程比较麻烦,你可以直接拿(条件值-初始值)/步长,得到一个数。

如果是整数,且判定条件中>,刚刚上面我设的X的值=该整数-1

如果是整数,且判定条件中≥,刚刚上面我设的X的值=该整数

如果是小数,那么整数部分就是刚刚上面我设的X,再计算出结束值一样套入公式即可。

为什么要分类讨论,是什么原理?

#

原理

#

首先条件判断值和结束值一定是相近的,不可能距离超过一个步长。分为两种情况

结束值与条件判断值重合

结束值与条件判断值偏移一个步长内

>和≥区别

#

当结束值与条件判断值重合时分为条件>和≥区别

对比一下下面两个问题

假设现在我从第1米开始植树(初始值为1),每隔1米值1棵树(步长为1),我要求不能超过6米(条件为i≤6),那么我一共植了多少颗数(问循环了几次)

T T T T T T

0---1---2---3---4---5---6

假设现在我从第1米开始植树(初始值为1),每隔1米值1棵树(步长为1),我要求小于6米(条件为i<6),那么我一共植了多少颗数(问循环了几次)

T T T T T X

0---1---2---3---4---5---6

同样是循环,那么判定点的条件不一样可能会导致结束值不一样。

因为条件值取不到,所以会少一次循环

前者的计算X的值(6-1)/1=5,所以循环次数就是6

后者计算X的值(6-1)/1-1=4,所以循环次数就是5

偏移一个步长内

#

这个就很简单了,直接取整是因为X本质上来说就是循环次数,我们要求的是满足条件的最后一个数,所以如果循环出现了小数,说明循环不能够执行完成就能满足条件,那么意味着他执行完循环必定不满足条件

看看例子

假设现在我从第1米开始植树(初始值为1),每隔2米值1棵树(步长为2),我要求不能超过6米(条件为i≤6),那么我一共植了多少颗数(问循环了几次)

T X T X T X

0---1---2---3---4---5---6

X的值计算的公式为(6-1)/2=2.5

这意味着循环2.5次,也就是说在执行第三次的时候,不执行完就能满足i≤6这个值。换句话说如果执行完第三次,那么第三次的值必定不满足i≤6,所以X取整数部分,循环X次得出来的结果就是最后一个满足条件的值

结论

#

(条件值-初始值)/步长,得到一个数与X相关联

又因为循环次数=X+1,所以

如果是整数,且判定条件中>,循环次数=该整数

如果是整数,且判定条件中≥,循环次数=该整数+1

如果是小数,循环次数=该数整数部分+1

只需要记住第一种情况取不到所以-1+1刚好抵消掉了

程序中的循环例子

#

while循环

#

Python

#

i=1

while (i<=100):

i=i+2

初始值为1

结束值待求

步长为2

条件为i≤100

计算(100-1)/2取整+1=50

VB

#

Dim i As Integer

i = 22

Do While i < 100

i = i + 2

Loop

初始值为22

结束值待求

步长为2

条件为i<100

计算(100-22)/2=39

for循环

#

Python

#

for i in range(100):

对于for循环,其实是可以改写为while循环,while循环一眼就能看出条件

i=0

while (i<100):

i=i+1

初始值为0

结束值待求

步长为1

条件为i<100

计算(100-0)/1=100

VB

#

For i = 1 To 100 Step 2

Next

相当于

Dim i As Integer

i = 0

Do While i <= 100

i = i + 2

Loop

初始值为0

结束值待求

步长为2

条件为i<=100

计算(100-0)/2然后+1=51