循环次数 #
前言 #
很多同学来问我循环体循环了几次到底该怎么判定?我打算今天给出一个通用的解决方案
下面我以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