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