还剩28页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
循环语句教学课件for什么是循环?for循环是编程语言中最常用的循环结构之一,它允许程序员指定一段代for码重复执行多次可以将循环理解为让计算机自动重复执行同一任务for的指令循环结构的本质是定义明确的起始条件•设定循环继续的条件判断•指定每次循环后如何改变循环变量•编写需要重复执行的代码块•循环的设计初衷是使代码更加简洁、高效,特别适合于已知需要重复for多少次的场景日常生活中的循环连续写数字每日刷牙工厂流水线当我们需要在纸上写下到的所有数字时,一个人每天刷牙三次(早中晚)也是一种循环工厂的流水线作业是循环的典型例子工人可能1100我们实际上是在执行一个循环任务写下,写这个循环有明确的次数(次),每次执行相同需要对每个产品执行相同的操作,直到所有产品13下,写下直到写下如果用循环表的动作(刷牙),并且有明确的循环变量(第几都处理完毕这种情况下,循环次数等于产品数
23...100for达,就是从开始,每次加,直到达到为次刷牙)这与循环的思想完全一致量,循环体是处理单个产品的动作11100for止循环核心作用for提高效率想象一下,如果需要打印到的所有数字,若不使用循环,你需要编写行代码而使110001000用循环,只需几行代码就能完成,大大提高了编程效率for增强可读性循环使代码更加简洁,逻辑更清晰读代码的人可以一眼看出重复执行的模式,而不必阅读大量重复的代码行提升可维护性当需要修改循环内的操作时,只需修改一次,而不是修改多处重复代码,减少了出错可能性常见应用场景数据批量处理对数组、列表中的每个元素执行相同操作•生成重复模式如图形渲染、表格生成等•固定次数的操作如尝试连接服务器次•5迭代计算如计算斐波那契数列•文件处理读取或写入多个文件•循环基本结构for语法格式for初始表达式;条件表达式;迭代表达式{//循环体需要重复执行的代码}1这一结构清晰地定义了循环的起点、终点和每次循环后的变化,使计算机能够精确控制重复执行的过程代码示例for int i=1;i=5;i++{System.out.printlni;//打印当前i的值}2这个例子将打印出到的所有整数,展示了循环的基本用法初始值为,条件是不超过,每轮循环后增加15for1i5i1三个关键部分初始表达式设置循环变量的初始值,只执行一次条件表达式每轮循环前判断,决定是否继续循环迭代表达式每轮循环结束后执行,更新循环变量循环语法详解for初始表达式()迭代表达式()Initialization Iteration初始表达式在循环开始前执行一次,用于设置循环变量的初始值迭代表达式在每轮循环结束后执行,通常用于更新循环变量的值int i=1;//设置循环变量i的初始值为1i++;//i的值增加1//或者i+=2;//i的值增加2初始表达式可以声明新变量,也可以使用已有变量甚至可以初始化多个变量迭代表达式可以包含多个操作int i=0,j=10;//同时初始化两个变量条件表达式()i++,j--;//i增加1,同时j减少1Condition条件表达式在每轮循环开始前评估,结果为则继续循环,为则结束循环循环体()true falseLoopBody循环体是花括号内的代码块,包含每次循环需要执行的代码i=5;//当i小于等于5时继续循环{}条件可以是任何返回布尔值的表达式,包括复杂条件{System.out.printlni;//打印i的值sum+=i;//累加i的值到sum变量}i10j0;//同时满足两个条件如果循环体只有一条语句,花括号可以省略,但为了代码清晰,建议始终使用花括号循环流程图for以上流程图直观展示了循环的执行过程for初始化阶段执行初始表达式,设置循环变量的起始值(仅执行一次)条件判断阶段检查条件表达式是否为真如果为真()继续执行循环体•true如果为假()退出循环,执行循环后的代码•false执行循环体执行花括号内的代码块{}迭代阶段执行迭代表达式,更新循环变量的值返回判断回到步骤,重新判断条件表达式2这个流程会不断重复,直到条件表达式评估为假()理解这个流程对掌握循false for环至关重要,它帮助我们预测循环的行为并排查潜在问题第一个循环示例for代码示例输出所有数字输出结果1~5public classForLoopExample{public staticvoid mainString[]args{//使用for循环打印1到5当前数字:1当前数字:2当前数字:3当前数字:4当前数字:5循环结束!的所有数字for int i=1;i=5;i++{System.out.println当前数字:+i;}System.out.println循环结束!;}}执行过程初始化为
1.i1代码解析检查条件为,执行循环体
2.1=5true打印当前数字
3.:1初始化int i=1设置循环变量i的初始值为1执行,变为
4.i++i2条件判断i=5当i小于等于5时,循环继续检查条件为,执行循环体
5.2=5true迭代i++每次循环后i的值增加1依此类推,直到变为
6.i6循环体打印当前的值•i检查条件为,退出循环
7.6=5false打印循环结束
8.!代码剖析逐步理解步骤初始化阶段11int i=1;2步骤条件判断阶段2这行代码只执行一次,在循环开始前它声明了一个整型变量并赋值为这个变量i1将作为循环计数器,追踪循环执行的次数i=5步骤执行循环体33每轮循环开始前,计算机会检查这个条件如果为真(即小于等于),则执行循环i5体;如果为假(大于),则跳出循环初始时为,满足条件,因此进入循环体i5i1System.out.println当前数字:+i;4步骤迭代阶段4执行循环体内的代码,这里是打印当前的值第一次执行时打印当前数字i:1i++步骤重复判断与执行55执行完循环体后,执行迭代表达式,这里是将的值增加第一轮循环后,从变为i1i1返回步骤,重新判断条件此时为,仍满足,因此再次执行循环体,打印2i2i=52当前数字之后变为,继续循环:2i36步骤循环结束6当增加到时,条件不再满足,循环结束,程序继续执行循环后的代码,打印i6i=5循环结束!多种写法举例从大到小输出(递减循环)自定义步长(每次增加)2//从10到1倒序输出for int i=10;i=//输出1到10之间的奇数for inti=1;i1;i--{System.out.printlni;}=10;i+=2{System.out.printlni;}输出输出10,9,8,7,6,5,4,3,2,11,3,5,7,9这个循环使用作为迭代表达式,使的值每次减少这个循环使用作为迭代表达式,使的值每次i--i i+=2i初始值为,当大于等于时继续循环增加初始值为,通过这种方式可以只输出奇数110i121自定义条件(复杂条件判断)//从1数到20,但跳过能被3整除的数for inti=1;i=20;i++{if i%3!=0{System.out.printlni;}}输出1,2,4,5,7,8,10,11,13,14,16,17,19,20这个循环使用标准的迭代,但在循环体内使用语句过滤掉能被整除的数i++if3练习打印偶数需求描述输出结果编写一个程序,使用for循环打印出2到10之间的所有偶数246810方法一步长为2//使用步长为2的方式for inti=2;i=10;i+=2{System.out.printlni;}方法对比两种方法都能达到相同的结果,但有不同的特点这种方法直接从2开始,每次增加2,自然只会打印偶数方法一(步长为2)方法二条件判断•代码更简洁,循环次数更少(只循环5次)•效率更高,没有不必要的判断//使用条件判断的方式for inti=1;i=10;i++{if i%2==0{System.out.printlni;}}•适合只需要处理偶数的场景方法二(条件判断)•循环次数较多(循环10次)•但更灵活,可以在循环中同时处理奇数和偶数•适合需要对所有数进行不同处理的场景这种方法检查每个数是否为偶数(能被2整除),如果是则打印出来循环在数组中的应用for123数组遍历基本语法数组元素求和查找数组元素//定义一个整数数组int[]numbers={10,20,30,//计算数组所有元素的和int[]scores={85,92,//在数组中查找特定元素int[]data={3,7,2,9,40,50};//使用for循环遍历数组for inti=0;i78,90,88};int sum=0;for inti=0;i5,1,8};int target=5;int position=-1;for numbers.length;i++scores.length;i++{sum+=inti=0;idata.length;i++{if{System.out.println第+i+1+个元素:scores[i];}double average=double sum/data[i]==target{position=i;+numbers[i];}scores.length;System.out.println总分:+break;//找到目标后立即退出循环}}ifsum;System.out.println平均分:+average;position!=-1{System.out.println找到目标+target+,位置是:+position;}else{System.out.println目标+target+不在数组中;}注意循环条件是而不是,因为数组索引inumbers.length=从开始,最后一个元素的索引是0length-1这个例子展示了如何使用循环计算数组元素的总和和平均值这个例子展示了如何在数组中查找特定元素,并使用提break前结束循环嵌套循环简介for什么是嵌套循环?简单示例打印矩形嵌套循环是指在一个循环内部包含另一个循环的结构当外层循环执行一次时,内层循环会完整地执行一遍//使用嵌套循环打印5x3的矩形for inti=0;i3;i++{//控制行数for intj=0;j5;j++{//控制列数基本语法System.out.print*;}System.out.println;//换行}for初始表达式1;条件表达式1;迭代表达式1{//外层循环体for初始表达式2;条件表达式2;迭代表达式2{//内层循环体}}输出结果常见应用场景***************•处理二维数组或矩阵•生成表格数据嵌套循环执行特点•打印图形(如三角形、矩形等)•多层级数据的遍历当外层循环执行一次时,内层循环会完整执行所有迭代假设外层循环执行m次,内层循环执行n次,则内层循环体总共执行m×n次•排序算法(如冒泡排序)例子乘法表99使用嵌套循环打印乘法表输出结果99//使用嵌套for循环打印九九乘法表public classMultiplicationTable{public staticvoid mainString[]args{for inti1×1=11×2=22×2=41×3=32×3=63×3=91×4=42×4=83×4=124×4=161×5=52×5=103×5=154×5=205×5=251×6=62×6=123×6=184×6=245×6=30=1;i=9;i++{for intj=1;j=i;j++{System.out.printj+×+i+=+i*j+6×6=361×7=72×7=143×7=214×7=285×7=356×7=427×7=491×8=82×8=163×8=244×8=325×8=406×8=487×8=568×8=641×9=92×9=183×9=27\t;}System.out.println;//每行结束后换行}}}4×9=365×9=456×9=547×9=638×9=729×9=81执行流程分析代码解析以第3行为例•外层循环控制行数,从1到9,共9行
1.外层循环i=3•内层循环控制每行的列数,从1到i(当前行号)
2.内层循环j从1到3•打印格式j×i=结果,其中j是列号,i是行号•j=1时,打印1×3=3•每完成一行后换行•j=2时,打印2×3=6•j=3时,打印3×3=
93.内层循环结束,打印换行
4.继续外层循环i=
4...案例图形输出(三角形)使用嵌套循环打印直角三角形输出结果//打印5行星号组成的直角三角形public classTrianglePattern{public staticvoid mainString[]args{int rows=5;***************for inti=1;i=rows;i++{//打印每行i个星号for intj=1;j=i;j++{System.out.print*;}System.out.println;//换行}}}变形倒直角三角形//打印倒直角三角形for inti=rows;i=1;i--{for intj=1;j=i;j++{System.out.print*;}System.out.println;}代码解析输出•外层循环控制行数,从1到5,共5行•内层循环控制每行的星号数量,从1到i(当前行号)***************•每完成一行后换行变形等腰三角形//打印等腰三角形for inti=1;i=rows;i++{//打印空格for intj=rows;ji;j--{System.out.print;}//打印星号for intk=1;k=2*i-1;k++{System.out.print*;}System.out.println;}语句与循环break for语句的作用代码示例找到特定值breakbreak语句用于提前终止循环的执行,无论循环条件是否仍然满足当执行到break语句时,程序会立即跳出当前循环,继续执行循环后的代码//在数组中查找第一个值为3的元素int[]numbers={1,5,3,7,9,3,2};int targetIndex=-1;for inti=0;inumbers.length;i++break语句在以下情况特别有用{if numbers[i]==3{targetIndex=i;•找到特定条件后不需要继续循环System.out.println找到数字3,位置:+i;break;//找•出现错误或异常情况需要立即退出循环到第一个3后立即退出循环}}if targetIndex==-1{System.out.println数组中没有数字3;}•性能优化,避免不必要的迭代输出找到数字3,位置:2这个示例中,一旦找到第一个值为3的元素,立即使用break退出循环,不再继续查找后面的元素注意事项•break只能跳出当前所在的最内层循环,不能跳出外层循环•如需跳出多层嵌套循环,可以使用标签(labeled break)或设置标志变量•过度使用break可能导致代码逻辑复杂,难以理解和维护•break语句通常与if条件判断一起使用//使用标签跳出多层循环的例子outerLoop:for inti=0;i3;i++{for intj=0;j3;j++{if i==1j==1{break outerLoop;//跳出外层循环}System.out.printlni+,+j;}}语句与循环continue for语句的作用与的区别continue break continuecontinue语句用于跳过当前循环的剩余部分,直接进入下一次循环与break不同,continue不会终止整个循环,而是立即跳到循环的下一次迭代break continuecontinue语句在以下情况特别有用完全终止循环只跳过当前迭代•需要跳过特定条件的处理•某些情况下不需要执行循环体的全部代码循环后的代码立即执行继续下一次循环迭代•处理异常情况但仍需继续循环常用于找到特定条件后退出常用于跳过特定条件的处理代码示例跳过特定值复杂示例过滤操作//打印1到10之间除了6以外的所有数字for inti=1;i=10;i++{if i==6{continue;//跳过当前循环,不打印6}System.out.printlni;}//打印1到20之间的奇数,跳过能被3整除的数for inti=1;i=20;i++{//跳过偶数if i%2==0{continue;}//跳过能被3整除的数if i%3==0{continue;}System.out.printlni;}输出1,2,3,4,5,7,8,9,10这个示例中,当i等于6时,执行continue语句,跳过打印操作,直接进入下一轮循环(i=7)输出1,5,7,11,13,17,19这个示例使用了两个continue语句第一个跳过所有偶数,第二个跳过能被3整除的数最终只打印既是奇数又不能被3整除的数、、对比for whiledo while循环循环循环for whiledo-whilefor初始表达式;条件表达式;迭代表达式{//初始表达式;while条件表达式{//循环体初始表达式;do{//循环体迭代表达式;}循环体}迭代表达式;}while条件表达式;特点结构紧凑,三个控制表达式写在一起•特点特点循环变量的作用域限制在循环内•结构更灵活,控制表达式分散条件判断在循环体之后••适合已知循环次数的场景•循环变量作用域可能更广循环体至少执行一次••适合需要计数的循环•适合未知循环次数的场景适合需要先执行后判断的场景••适用场景数组遍历、固定次数操作、有明确计数需求的循环适合基于条件判断的循环其余特性与循环类似••while适用场景基于条件的循环、读取未知长度的数据、用户输入适用场景至少需要执行一次的操作、用户输入验证、菜单系处理统选择合适的循环结构可以使代码更加清晰和高效一般来说,当你知道循环的确切次数时,选择循环;当循环次数不确定,依赖于某个条件时,选择循环;当循环体必须至少执行一次时,选择for whiledo-循环while循环常见错误for12死循环(无限循环)步长方向与终止条件不符//错误示例忘记更新循环变量for inti=0;i10;{System.out.printlni;//这里忘记了i++}//错误示例步长方向与条件不匹配for inti=10;i0;i++{System.out.printlni;}这里从开始,条件是,但每次增加而不是减少,导致条件永远为真,形成死循环i10i0i修正方法确保迭代表达式正确更新循环变量,或者在循环体内更新变量修正方法使步长方向与终止条件匹配for inti=0;i10;i++{System.out.printlni;}for inti=10;i0;i--{System.out.printlni;}34花括号遗漏问题数组索引越界//错误示例遗漏花括号for inti=0;i5;i++System.out.printlni;System.out.println当前值//错误示例数组索引越界int[]arr={1,2,3,4,5};for inti=0;i=arr.length;i+++i;//编译错误!{System.out.printlnarr[i];//当i=5时越界!}没有花括号时,循环体只包含一条语句第二条语句在循环外,且无法访问循环变量i数组索引应从到,而不是到修正方法使用花括号包围所有需要循环的语句0length-1length修正方法使用正确的索引范围for inti=0;i5;i++{System.out.printlni;System.out.println当前值+i;}for inti=0;iarr.length;i++{System.out.printlnarr[i];}避免这些常见错误可以节省大量调试时间并提高代码质量养成良好的编程习惯,如使用清晰的变量名、添加注释、保持代码缩进和使用花括号等,可以减少错误发生的可能性调试技巧与规范变量命名规范注释规范有意义的变量名使用描述性的变量名,如index、count、row而非i、j、k目的注释说明循环的目的,而非重复代码逻辑循环计数器例外简单循环中可以使用i、j、k作为循环变量复杂逻辑注释解释不直观的循环条件或特殊处理匈牙利命名法在变量名前添加类型前缀,如iCount表示整型计数器边界条件注释说明循环的起始和结束条件驼峰命名法第一个单词小写,后续单词首字母大写,如totalSum//良好的注释示例//计算及格学生60分以上的平均分double sum=0;int passCount=0;for inti=0;iscores.length;i++{//代码格式规范跳过不及格的分数if scores[i]60{continue;}sum+=scores[i];passCount++;}//避免除零错误doubleaverage=passCount0sum/passCount:0;一致的缩进通常使用4个空格或1个制表符花括号对齐开括号与for语句同行,闭括号与for对齐语句间隔添加适当空行增强可读性操作符周围空格如i=i+1而非i=i+1//良好的格式示例for intstudentCount=0;studentCounttotalStudents;studentCount++{double studentScore=scores[studentCount];totalScore+=studentScore;if studentScorehighestScore{highestScore=studentScore;}}调试技巧打印调试在关键点添加输出语句,显示变量值断言测试验证变量在循环中的取值范围循环不变量定义循环过程中保持不变的条件单步执行使用调试器逐步执行循环,观察变量变化业务中循环的应用举例for统计学生成绩批量文件处理页面元素渲染//计算班级成绩统计数据double[]scores={78,92,63,85,91,77,//批量处理文件夹中的所有文本文件File folder=new Filedata;File[]//前端渲染表格数据function renderTabledata{let tableHtml=59};double sum=0;double highest=scores
[0];double lowest=files=folder.listFiles;for inti=0;ifiles.length;i++table;//渲染表头tableHtml+=tr;for letiscores
[0];int passCount=0;for inti=0;iscores.length;i++{if files[i].isFile=0;iheaders.length;i++{tableHtml+=th+{sum+=scores[i];if scores[i]highest files[i].getName.endsWith.txt headers[i]+/th;}tableHtml+=/tr;//渲染{highest=scores[i];}if scores[i]lowest{System.out.println处理文件:+数据行for leti=0;idata.length;i++{tableHtml{lowest=scores[i];}if scores[i]=60files[i].getName;//读取文件内容try+=tr;for letj=0;jdata[i].length;j++{passCount++;}}double average=sum/{BufferedReader reader=new{tableHtml+=td+data[i][j]+/td;}scores.length;double passRate=double passCount/scores.length BufferedReadernew FileReaderfiles[i];tableHtml+=/tr;}tableHtml+=/table;*100;System.out.println平均分:+average;System.out.println String line;int lineCount=0;document.getElementByIdtableContainer.innerHTML=tableHtml;}最高分:+highest;System.out.println最低分:+while line=reader.readLine!=null{//处理lowest;System.out.println及格率:+passRate+%;每一行文本lineCount++;}System.out.println文件共+lineCount+行;reader.close;}catch Exceptione{System.out.println处理文件出错:+e.getMessage;}}}这些示例展示了循环在不同业务场景中的实际应用循环结构的灵活性使其成为处理批量数据、生成重复内容和执行迭代计算的理想选择通过掌握循环,你可以更高效地解决各种编程问题for for进阶用法变量可变步长1变量步长的概念代码示例变量步长在标准for循环中,步长通常是固定的(如i++或i+=2)但在某些场景下,我们需要步长在循环过程中动态变化,这就是变量步长//使用可变步长的循环示例public classVariableStepExample{public staticvoid mainString[]args{int step=1;基本实现方法int sum=0;for inti=1;i=20;i+=step{System.out.println当前数:+i+,步长:+step;sum+=i;//每次循环后增加步长if i%5==0{step++;•在循环体内修改迭代表达式中使用的变量System.out.println步长增加到:+step;}}System.out.println总和:+sum;}}•根据特定条件动态调整每次循环的步长•使用数学公式或算法计算下一步的步长适用场景•数学计算(如加速收敛的算法)•自适应处理(根据数据特征调整步长)•模拟物理过程(如加速度变化)•搜索算法(如二分查找)执行结果分析在这个例子中•初始步长为1,即i每次增加1•当i是5的倍数时,步长增加1•第一次循环后,i=1,步长仍为1•当i=5时,步长增加到2•之后i=
7、
9、
11...•当i=10时,步长增加到3•以此类推进阶用法循环倒序2for倒序循环的语法常见应用场景性能考虑•需要从后向前处理数据的情况在某些特定情况下,倒序循环可能比正序循环性能更好for inti=n;i=0;i--{//循环体}•栈操作(后进先出)•数组操作从后向前删除元素可减少元素移动•倒计时效果•条件判断某些条件在后面的元素更容易满足•从数组末尾删除元素•缓存利用某些数据结构的内存布局适合倒序访问倒序循环从大值开始,向小值递减这与标准循环相反,后者通常从小值开始向大值递增•逆序打印或处理代码示例倒计时代码示例倒序遍历数组//实现一个简单的倒计时public classCountdownExample{public staticvoid mainString[]args{System.out.println倒//倒序遍历数组查找最后一个偶数public classFindLastEvenNumber{public staticvoid mainString[]args{int[]numbers计时开始!;for inti=10;i=1;i--{System.out.printlni;//模拟延={3,7,2,8,9,4,1,5};int lastEven=-1;//从后向前遍历for inti=numbers.length-1;i时try{Thread.sleep1000;//暂停1秒}catch InterruptedExceptione=0;i--{if numbers[i]%2==0{lastEven=numbers[i];System.out.println找{e.printStackTrace;}}System.out.println发射!;}}到最后一个偶数:+lastEven;System.out.println位置:+i;break;//找到后立即退出循环}}if lastEven==-1{System.out.println数组中没有偶数;}}}进阶用法多变量控制3多变量循环的概念代码示例两端向中间多变量循环是指在循环的初始化、条件判断和迭代部分使用多个变量来控制循环的行为这种技术可以实现更复杂的循环逻辑和更高效的算法//使用两个变量从两端向中间移动public classTwoPointerExample{public staticvoid mainString[]args{int[]arr={1,语法格式2,3,4,5,6,7,8,9,10};//从两端向中间遍历for intleft=0,right=arr.length-1;leftright;left++,right--{System.out.println交换:+arr[left]+和+arr[right];//交换两端的元素int temp=arr[left];arr[left]=for inta=0,b=10;ab;a++,b--{//循环体}arr[right];arr[right]=temp;}//打印交换后的数组System.out.print结果:;for inti=0;iarr.length;i++{System.out.printarr[i]+;}}}注意事项•初始化部分可以声明多个变量,用逗号分隔•条件部分可以包含多个变量的比较•迭代部分可以同时更新多个变量•多个变量必须是相同类型(如果在初始化部分声明)输出交换:1和10交换:2和9交换:3和8交换:4和7交换:5和6结果:10987654321大型数据与循环效率for1循环的时间复杂度单层for循环通常具有On的时间复杂度,其中n是循环次数这意味着执行时间与输入数据大小成正比不同嵌套层级的复杂度•单层循环On•两层嵌套循环On²•三层嵌套循环On³随着数据规模增大,高阶复杂度的循环执行时间会急剧增加,因此处理大型数据时需要特别注意循环效率2循环优化原则减少循环次数尽可能减少不必要的迭代减少嵌套层数降低时间复杂度量级循环内部优化移出循环内不必要的计算合理利用break和continue避免不必要的迭代循环展开减少循环控制开销缓存优化考虑内存访问模式,提高缓存命中率3优化示例移出不变计算//优化前for inti=0;iarray.length;i++{result+=array[i]*Math.sqrtcomplicated;}//优化后double factor=Math.sqrtcomplicated;for inti=0;iarray.length;i++{result+=array[i]*factor;}将循环不变量计算移到循环外,避免重复计算,可显著提高效率4优化示例循环合并//优化前for inti=0;in;i++{a[i]=b[i]+c[i];}for inti=0;in;i++{d[i]=a[i]*2;}//优化后for inti=0;in;i++{a[i]=b[i]+c[i];d[i]=a[i]*2;}循环的局限性for嵌套层数过多导致可读性下降不适合处理极大数据量当for循环嵌套层数过多(通常超过3层)时,代码变得难以阅读和维护每增加一层嵌套,代码的复杂度就会成倍增加当处理非常大的数据集时,传统for循环可能导致性能问题,特别是在内存消耗和处理时间方面在这些情况下,流处理、并行计算或分布式计算可能更合适//多层嵌套的for循环难以阅读for inti=0;in;i++{for intj=0;jm;j++{for intk=0;kp;k++{for intl=0;lq;l++{//执行某些操作}}}}//Java8+流处理代替循环List numbers=Arrays.asList1,2,3,4,5;//传统for循环int sum=0;for int num:numbers{ifnum%2==0{sum+=num*2;}}//使用流处理int streamSum=numbers.stream.filternum-num%2==
0.mapToIntnum-num*
2.sum;灵活性不如函数式编程和递归对于某些复杂的问题,for循环可能不如递归或函数式编程方法优雅特别是处理树形结构、图算法或需要回溯的问题时,递归通常是更自然的选择//递归实现斐波那契数列public int fibonacciint n{if n=1return n;return fibonaccin-1+fibonaccin-2;}//相比之下的循环实现public intfibonacciLoopint n{if n=1return n;intfib=1;int prevFib=1;for inti=2;in;i++{int temp=fib;fib+=prevFib;prevFib=temp;}return fib;}对于不确定次数的场景不便利for循环最适合已知迭代次数的场景对于不确定迭代次数的情况,while循环通常更为合适//读取文件内容,次数不确定BufferedReader reader=new BufferedReadernewFileReaderdata.txt;Stringline;//使用while循环更自然while line=reader.readLine!=null{System.out.printlnline;}课堂小测123练习计算的偶数和练习斐波那契数列前项练习等差数列11~1002103编写一个程序,计算到之间所有偶数的和编写一个程序,使用循环计算并打印斐波那契数列的前项编写一个程序,生成一个等差数列,首项为,公差为,输出前项1100for10138public classEvenSum{public staticvoid publicclass Fibonacci{public staticvoidmainString[]args{int sum=0;mainString[]args{intn=10;int publicclass ArithmeticSequence{public static//方法1使用步长为2for inti=2;i=100;first=0,second=1;void mainString[]args{int firstTerm=1;i+=2{sum+=i;}System.out.println斐波那契数列前+n+项;//首项int difference=3;//公差//方法2使用条件判断/*sum=0;//for inti=0;in;i++int terms=8;//项数重置sum for inti=1;i=100;i++{System.out.printfirst+;S ys tem.out.println等差数列前+terms+项;{if i%2==0{sum+=//计算下一个数int next=first+second;f orinti=0;iterms;i++{inti;}}*/first=second;second=currentTerm=firstTerm+i*difference;System.out.println1到100的偶数和为:+sum;}}next;}}}System.out.printcurrentTerm+;}}}输出结果等差数列前项81471013161922输出结果斐波那契数列前项100112358132134输出结果到的偶数和为1100:2550课外拓展应用图形界面动态元素网络爬虫分次抓取游戏碰撞检测在图形用户界面编程中,循环常用于动态生成和操作界面元素例如,创建一个游戏在网络爬虫应用中,循环用于控制抓取的页面数量、设置请求间隔或处理分页数据合理设在游戏开发中,循环用于碰撞检测、物理模拟和行为控制每一帧都需要检查游戏对象之GUI for forforAI界面的网格、动态生成表单字段或实现动画效果置循环可以避免对目标网站造成过大压力间的相互作用,这通常通过循环实现//创建一个5x5的按钮网格for introw=0;row5;row++{for int//抓取某网站的前10页内容for intpage=1;page=10;page++//游戏主循环while gameRunning{//更新所有游戏对象位置for inti=0;col=0;col5;col++{Button button=new Button;{String url=https://example.com/listpage=+page;igameObjects.length;i++{gameObjects[i].update;}//碰撞检测button.setTextrow+,+col;button.setLayoutXcol*100;System.out.println正在抓取第+page+页;//发送HTTP请求获取for inti=0;igameObjects.length;i++{for intj=i+1;j button.setLayoutYrow*100;页面内容Document doc=Jsoup.connecturl.get;//解析页面内gameObjects.length;j++{if checkCollisiongameObjects[i],pane.getChildren.addbutton;}}容Elements items=doc.select.item;//处理每个商品for gameObjects[j]{handleCollisiongameObjects[i],gameObjects[j];}}}Element item:items{String title=//渲染游戏画面render;//控制游戏帧率Thread.sleep16;//约60帧每秒}item.select.title.text;String price=item.select.price.text;System.out.printlntitle+:+price;}//避免请求过于频繁Thread.sleep1000;}小结与常见问题解答核心知识点回顾常见问题解答循环基本结构初始表达式、条件表达式和迭代表达式for问如何在循环中累加数值?循环控制语句和的使用breakcontinue嵌套循环多层循环的应用答使用一个变量存储累加结果,在循环中更新它for循环变量作用域和命名规范循环优化提高循环效率的方法int sum=0;for inti=1;i=10;i++{sum+=i;//等同于sum=sum+i;}变形用法倒序循环、多变量控制等常见概念混淆点澄清与的区别是先使用后增加,是先增加后使用,在循环的迭代表达式中效果相同i++++i i++++i forbreak与continuebreak终止整个循环,continue只跳过当前迭代问如何跳出嵌套循环?循环条件与两者等价,但前者更常用in i=n-1答可以使用标签()或设置标志变量labeled break死循环原因忘记更新循环变量或条件永远为真适合已知循环次数,适合条件控制for vswhile forwhileboolean found=false;for inti=0;in!found;i++{forintj=0;jm;j++{ifcondition{found=true;break;//只跳出内层循环}}}问数组索引为什么从开始?0答这是大多数编程语言的约定,源于内存寻址方式数组变量存储的是第一个元素的内存地址,索引表示的是与起始位置的偏移量感谢学习与交流答疑课程要点回顾练习建议在本次课程中,我们深入学习了for循环的各个方面,从基本语法到高级应用循环结构是编程中最常用的控制流之一,掌握for循环将使您能够更高效地解决各种编程能力的提升离不开实践建议您编程问题•每天编写至少一个使用循环的小程序进一步学习资源•尝试解决各种类型的问题(数值计算、字符串处理、数组操作等)《Java编程思想》-Bruce Eckel著,深入讲解Java编程概念•挑战自己,尝试用不同方法解决同一问题《算法》-Robert Sedgewick著,介绍各种算法实现•阅读他人的代码,学习不同的循环使用技巧LeetCode网站-提供大量编程练习题,可以练习循环应用•参与编程竞赛或挑战,如Codeforces、AtCoder等编程论坛-StackOverflow等平台可解答具体问题联系方式与答疑渠道在线IDE-如Repl.it,便于快速测试代码片段如果您有任何问题或需要进一步的解释,可以通过以下方式联系我•课后答疑时间每周
二、四14:00-16:00•在线论坛www.example.com/forum/programming•电子邮件teacher@example.com•学习群QQ群号123456789。
个人认证
优秀文档
获得点赞 0