循环这一章节的知识,是所有初学者都必须经过的坎!。
之前学习的数据运算、分支判断,多多少少会跟现实世界有些联系,学起来不会感到完全陌生。
然而循环这一块,虽然现实世界中,很多事情也在不断重复,但大部分人不会使用循环这样的思维去看待现实世界中的重复问题,因此,当教程进入到循环这一章节时,会感觉到完全陌生。
学习方法只有多看多想多练,直到成为习惯和本能,如同呼吸。
本文总结了一些在开发中常见的循环问题,希望通过这样的总结,可以帮助你建立起循环的思维。
看本文的过程中,不要急功近利,一定要心平气和,慢慢看,慢慢想,自己再跟着每个案例写一次。
建议你最好先去洗个脸( ̄▽ ̄)
循环指定的次数
有的时候,我们要做的事情,只是简单的重复某个行为指定的次数。
比如,输出100个星号,输出50个”你好”,保存10份内容完全相同的文件,宝宝吃饭的时候被要求再吃3口,等等等等。
面对这样的问题,在代码中可以使用下面的结构:
for(int i = 0; i < 次数; i++)
{
//重复的动作
}
比如,要输出10个星号,可以使用这样的代码:
for(int i = 0; i < 10; i++)
{
Console.Write("*");
}
由于i的取值是0-9,则刚好循环了10次,输出结果如下:
**********
遍历
遍历是循环中最常见的问题。
所谓遍历,是指有某个范围的样本数,需要把样本中的每个数据取出来一一分析。
比如,输出100-200之间的所有数字,它的样本范围就是100-200,需要你依次把样本中的每一个数据取出来输出。
再比如,将50-70之间的所有数字相加求和,它的样本范围就是50-70,需要你依次把样本中的每一个数据取出来累加。
这,就是遍历问题。
遇到遍历问题,绝大部分情况下,都需要使用一个循环变量,它从样本的起始值(或结束值)开始,每次递增(或递减),这样,就可以取到每一个样本的数据。
遍历问题的通用循环格式如下:
//方式一:顺序遍历
for (int i = 样本起始值; i <= 样本结束值; i++)
{
// 每一次进入循环体,i,就是取出的其中一个样本数据
}
//方式二:逆序遍历
for (int i = 样本结束值; i >= 样本起始值; i--)
{
// 每一次进入循环体,i,就是取出的其中一个样本数据
}
比如,一个简单的遍历问题,输出1-8之间的所有数字,可以使用以下的代码完成:
for (int i = 1; i <= 8; i++)
{
// 每一次进入循环体,i,就是取出的其中一个样本数据,输出该数据
Console.Write(i);
}
运行结果是:
12345678
当然,这只是一个最简单的遍历问题,遍历问题还会有很多的场景,下面,我将分别介绍这些常见的遍历场景。
遍历—样本筛选
有的时候,样本范围内的数据可能不是每一个我们都需要,而是只需要其中一部分,那么在遍历样本时,就需要对取出的每一个样本数据进行判断,看是否满足我们的需要,也就是要对样本进行筛选。
比如,输出1-10之间所有的奇数,虽然样本范围是1-10,但不是每一个样本数据都是我们需要的,因此,我需要对取出的每一个数据进行验证,看它是不是奇数,如果是,才输出。
可以使用下面的代码来完成输出1-10之间所有的奇数:
for (int i = 1; i <= 10; i++)
{
// 每一次进入循环体,i,就是取出的其中一个样本数据
// 判断该数据是不是奇数
if (i % 2 != 0)
{
Console.Write(i);// 该样本数据满足条件,输出
}
}
运行结果为:
13579
遍历—样本求和
有的时候,我们需要把样本范围内的所有数字相加,这就是求和问题。
面对求和的问题,可以使用这样的思路:在遍历之前,先准备好一个变量,值为0,然后取出样本的第一个数据,将变量的数据和第一个数据相加,然后再保存到变量中。然后对样本剩下的数据做同样的处理即可。
举个例子,比如让你对10-15之间的所有数字求和,可以使用如下的方案:
第一步:准备好一个变量,比如sum,让它的值为0
- sum = 0;
第二步:将样本范围内的每一个数和变量sum中保存的值累加,然后再保存到sum中:
- sum += 10; // sum:10
- sum += 11; // sum: 21
- sum += 12; // sum: 33
- sum += 13; // sum: 46
- sum += 14; // sum: 60
- sum += 15; // sum: 75
第三步:当遍历结束后,变量sum中的值就是累加求和的结果。
把上面的例子转换为代码如下:
//第一步
int sum = 0;
//第二步
for (int i = 10; i <= 15; i++)
{
sum += i;
}
//第三步
Console.Write("和为:" + sum);
输出结果如下:
和为:75
这就是求和问题的做法,类似的累计问题也是同样的方案,比如求10-15之间所有数的乘积,可以使用下面的代码:
//第一步
int sum = 1; // 求乘积要从1开始
//第二步
for (int i = 10; i <= 15; i++)
{
sum *= i; // 使用累乘
}
//第三步
Console.Write("积为:" + sum);
运行结果为:
积为:3603600
遍历—样本计数
样本计数问题往往会和样本筛选问题合并使用。
它是指这么一种场景,有一个样本范围,需要计算该样本范围中满足条件的样本数据有多少个。
比如,55-66中有多少个数能同时被2和3整除。
可以使用如下的思路解决:
第一步,准备好一个变量num,该变量表示满足要求的样本数据数量,一开始的值为0。
- int num = 0;
第二步,遍历样本,一个一个将样本数据拿出来,看看该样本数据是否满足要求,如果满足,将计数变量num自增1。
- 55 不满足要求,什么也不做
- 56 不满足要求,什么也不做
- 57 不满足要求,什么也不做
- 58 不满足要求,什么也不做
- 59 不满足要求,什么也不做
- 60 满足要求,num++ // num: 1
- 61 不满足要求,什么也不做
- 62 不满足要求,什么也不做
- 63 不满足要求,什么也不做
- 64 不满足要求,什么也不做
- 65 不满足要求,什么也不做
- 66 满足要求,num++ // num: 2
第三步,当遍历结束后,变量num中的值就是计数的结果。
把上面的例子转换为代码如下:
//第一步
int num = 0; // num表示计数的结果,在一开始,计数之前,为0
//第二步
for (int i = 55; i <= 66; i++)
{
if (i % 2 == 0 && i % 3 == 0)
{
num++;
}
}
//第三步
Console.Write("55-66中,共有" + num + "个数能同时整除2和3");
运行结果如下:
55-66中,共有2个数能同时整除2和3
计数问题有一个经典的场景,就是判断一个数是不是质数(素数)
什么是质数(素数)?质数(素数)是一个大于等于2的数,该数只能被1和自身整除。
这看上去不像是一个计数场景,甚至不像是任何一个遍历场景。先不着急,咱们一起分析一下。
既然质数只能被1和自身整除,换句话说,在1到该数之间,一定只有两个数能整除该数。比如,7是一个质数,因为1-7之间,只有两个数(1和7)能整除它。
仔细理解上面这段话,如果你理解了,就会发现这是一个什么问题呀?没错,这就是一个计数问题。
我们要判断一个数n是不是质数,只需要看1-n之间有多少个数能整除n,如果数目为2,它就是质数,否则,它就不是。
于是,可以使用下面的代码来判断:
int n = 3311; // 待判断的数n,假设它的值是3311
//下面是计数问题的代码
//第一步
int num = 0; //计数
//第二步,遍历范围1-n
for (int i = 1; i <= n; i++)
{
if (n % i == 0)
{
num++;//计数+1
}
}
//第三步,根据计数结果来判断
if (num == 2)
{
Console.Write(n + "是一个质数");
}
else
{
Console.Write(n + "不是一个质数");
}
执行结果:
3311不是一个质数
其他
有的时候,你面临的循环问题既不是固定次数的循环,也不是遍历问题,也有可能是遍历中几个问题的叠加。
比如,让你输出100-200之间的所有质数,你会怎么做呢?
它的代码格式如下:
for (int i = 100; i <= 200; i++)
{
//判断i是不是质数,如果是就输出
}
也就说,我只要解决如何判断i是不是质数即可,而判断质数的问题已经讲过,完整的代码如下:
for (int i = 100; i <= 200; i++)
{
//判断i是不是质数,如果是就输出
int num = 0;//计数
for (int j = 1; j <= i; j++)
{
if (i % j == 0)
{
num++; //找到了一个数能整除i,计数加1
}
}
if (num == 2)
{
Console.WriteLine(i);// 说明i是质数,输出它
}
}
总之,在面对这些问题的时候,只能具体问题具体分析,学习开发没有捷径可走(实际上,学习任何技术都是一样),更不能死记硬背,唯有多看多想多练。
这就相当于是武侠世界中的修行,一开始你会痴迷于各种兵器和招式,而当你熟悉了各种兵器、见过太多的招式、练就了深厚的内力时,你就可以忘掉这一切,尽兴发挥,所向披靡。