[关闭]
@Bei-S 2020-09-05T10:00:43.000000Z 字数 2999 阅读 917

循环

算法入门


循环主要用于处理重复执行一个代码块的情况。一般情况下,语句是按顺序进行的,即函数中第一个语句先进行,然后进行第二个,一次类推。而循环语句允许我们多次执行一个语句或者语句组,流程图如下

Created with Raphaël 2.1.2进入循环重复执行语句是否满足终止条件?跳出循环yesno

循环的分类

循环主要分为以下四大类

while循环:给定条件成立时,重复执行语句(在执行语句前判断条件是否成立)

  1. int i,a,b;
  2. i=1,a=0,b=0;
  3. while(i<=10){
  4. i++;
  5. a++;
  6. b--;
  7. }

这一段循环中我们的条件是i<=10,而i初始值为1,每次在循环语句中我们让i加1,因此这个循环语句回执行十次,而每次循环中a+1,b-1,最后a=10,b=-10。

for循环:可以简单管理循环变量的循环语句

  1. for(int i=1;i<=10;i++){
  2. a++,b--;
  3. }

这一段循环和上面while循环达到的效果是一样的,但是我们可以看到for循环中有三个语句,他们分别表示
A.我们定义了一个变量i,并把它赋值为1(该语句只在进入for循环时执行1次)
B.这段循环的条件为i<=10,每次进入循环时都会判断是否满足该条件,如果不满足,就会跳出循环,如果我们把i赋值为11,那么这段语句就不会执行了。
C.每次循环结束后进行的操作,可以根据题目自己选择,我这里选择让i+1.
所以for循环的顺序为:
定义i,赋值i=1,判断i=1满足i<=10,进入语句,执行a++,b--,执行i++,判断i=2满足i<=10,进入语句,再次执行a++,b--,......直到i=11时会跳出循环。因此一共执行了10次

do-while循环:大体同while循环(在执行语句前判断条件是否成立)

  1. int i,a,b;
  2. i=1,a=0,b=0;
  3. do{
  4. a++,b--;
  5. }while(i<=10)

这一段大体同while循环,但是注意它是在结尾判断条件,这就意味着该语句至少会被执行一次,即如果我们把i赋值为11,语句会执行一次,a=1,b=-1。

嵌套循环:在循环中继续使用循环

  1. for(int i=1;i<=10;i++){
  2. for(int j=1;j<=10;j++){
  3. a++,b--;
  4. }
  5. }

嵌套循环有多种嵌套,这里挑选for循环嵌套讲解。这个语句的意思就是在每次进行第一层关于i的循环时,会进行一次关于j从1到10的循环,代表每次执行一次第一层循环时,第二层循环都会执行10次,因此最终a=100,b=-100。嵌套循环的复杂度是相乘的,例如第一个循环n次,第二个循环为m次,那么时间复杂度就
嵌套循环一般情况下是用于处理二维相关问题的输入及输出。
以此类推,我们也可以进行多重嵌套以此来解决更多维的问题。

循环控制语句

循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。

break语句

break语句为终止循环,程序将从当前循环跳出,直接进行下一个语句

  1. for(int i=1;i<=10;i++){
  2. for(int j=1;j<=10;j++){
  3. a++,b--;
  4. break;
  5. }
  6. }
  7. cout<<a<<" "<<b;

如这一段嵌套循环,当进入j层循环时执行到break语句会跳出j层循环,因此每次j层循环只会进行一次a++,b--,因此最后a=10,b=-10。
但如果是如下写法

  1. for(int i=1;i<=10;i++){
  2. for(int j=1;j<=10;j++){
  3. break;
  4. a++,b--;
  5. }
  6. }
  7. cout<<a<<" "<<b;

那每次执行a++和b--前会先进行break,最终a=b=0。

continue语句

continue为停止本次循环,进入下一次循环

  1. for(int i=1;i<=10;i++){
  2. for(int j=1;j<=10;j++){
  3. if(j%2==0) continue;
  4. a++,b--;
  5. }
  6. }
  7. cout<<a<<" "<<b;

这段语句代表当j是偶数时,停止本次循环,进入下一次,如j=2时,if中判断条件为true,执行continue,直接跳到执行j++,这时j=3.再次进入循环,而不满足if语句,执行a++,b--;
因此每次i循环会执行5次a++和b--,最后a=50,b=-50。

break与continue区别

对比如下两端代码

  1. A for(int i=1;i<=10;i++){
  2. for(int j=1;j<=10;j++){
  3. if(j==3) continue;
  4. a++,b--;
  5. }
  6. }
  7. cout<<a<<" "<<b;
  8. B for(int i=1;i<=10;i++){
  9. for(int j=1;j<=10;j++){
  10. if(j==3) break;
  11. a++,b--;
  12. }
  13. }
  14. cout<<a<<" "<<b;

这两段中当执行到j层循环的j=3时,A模式会跳过j=3,直接执行j=4,因此每层i循环执行了9次a++,b--,
最终a=90,b=-90
而B模式在执行到j=3时,会直接跳出j循环,进入到i循环执行i++,因此每层i循环会执行2次a++,b--,最终a=20,b=-20

例题及代码

for循环:奇数求和

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int l,r;//l,r为题目中所给需要求和的左右端点,l代表left,r代表ringt
  5. int ans=0;//我们定义ans来记录最后的答案,同时因为局部变量定义后初值不一定为0,所以要赋值为0.
  6. scanf("%d%d",&l,&r);
  7. for(int i=l;i<=r;i++){
  8. if(i%2==1) {//当满足i%2==1,及i除以2余1时,表示i为奇数,把答案加上i
  9. ans=ans+i;
  10. }
  11. }
  12. cout<<ans;
  13. }

while循环&do-while循环

球弹跳高度的计算
while循环的写法:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. double h,ans=0;
  5. cin>>h;
  6. int i=1;
  7. while(i<=10){
  8. if(i==1) ans=ans+h;//要注意题目上所说为求小球经过路程,因此第一次我们经过高度为h,之后每次落地间隔要一上一下,经过2*h
  9. else ans=ans+h*2;
  10. h=h/2;
  11. i++;
  12. }
  13. cout<<ans<<endl<<h;
  14. }

do-while写法如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. double h,ans=0;
  5. cin>>h;
  6. int i=1;
  7. do{
  8. if(i==1) ans=ans+h;//要注意题目上所说为求小球经过路程,因此第一次我们经过高度为h,之后每次落地间隔要一上一下,经过2*h
  9. else ans=ans+h*2;
  10. h=h/2;
  11. i++;
  12. }while(i<=10);
  13. cout<<ans<<endl<<h;
  14. }

嵌套循环

求阶乘的和

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int n,ans=0;
  5. scanf("%d",&n);
  6. for(int i=1;i<=n;i++){//第一层循环枚举我们当前要求谁的阶乘并累加
  7. int k=1;//我们用k记录i!为多少
  8. for(int j=1;j<=i;j++){
  9. k=k*j;
  10. }
  11. ans=ans+k;
  12. }
  13. cout<<ans;
  14. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注