跳过正文
  1. Posts/

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

· loading · loading ·
教程 技巧 教程
Ohdmire
作者
Ohdmire
Think much.
目录

循环次数
#

前言
#

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

下面我以VBPython结合来解释

基础
#

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

  • 初始值
  • 结束值
  • 步长
  • 条件

上面这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.3X<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. 结束值与条件判断值重合
  2. 结束值与条件判断值偏移一个步长内

>和≥区别
#

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

对比一下下面两个问题

假设现在我从第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

相关文章

使用moonlight+tailscale在教室玩电脑
· loading · loading
教程 moonlight tailscale 异地组网 串流
大学生生存指南——网课
· loading · loading
教程 大学生 网课
使用opencc进行简繁转换
· loading · loading
教程 技巧 简体中文 繁体中文
Microsoft 365 E5开发者使用指南
· loading · loading
教程 E5 OneDrive Office365 微软
关于一些外服游戏下载节省流量
· loading · loading
教程 下载 Blue Archive Project Sekai Heaven Burns Red clash
bitwarden使用docker自建服务器教程
· loading · loading
教程 bitwarden 密码