循环结构:循环条件+循环操作
while循环:在循环刚开始时,会计算一次“布尔表达式”的值,若条件为真,执行循环体。而对于后来每一次额外的循环都会在开始前重新计算一次,语句中应有使循环趋向于结束的语句,否则会出现无限循环——“死循环”。(要避免死循环,会造成内存溢出)
循环结构都有如下四个结构组成:
(1)初始化:循环的初始化变量
(2)条件判断:条件返回必须是true或false
(3)循环体:条件满足的话执行的逻辑代码
(4)迭代:给循环跳出的条件
while和do-while的区别:
do-while先执行后判断,while先判断后执行
do-while总是保证循环体会被至少执行一次,这是主要差别 。
for循环:for循环语句是支持迭代的一种通用结构,是最有小、灵活的。
for循环比whike循环更简洁
语法形式:for(初始表达式;布尔表达式;步进){循环体}
增强for循环:for(int i : arr){System.out.println(i + "\t");}
注意事项:for循环在执行条件测试后,先执行程序部分,在执行步进部分,在for语句的初始化部分声明的变量,其作用域为整个for循环体。“初始化”和“循环条件表达式”部分可以使逗号来执行多个操作。如果三个部分都为空语句(分号不能省略),相当于一个无限循环。
跳转语句——break和continue、return
break:在任何循环语句的主体部分,均可用break控制循环流程。break用于强行退出循环,并执行循环中剩余的语句。(break语句还可用于多支语句switch中) break改变程序控制流,用于do-while、while、for中时,可跳出循环而执行循环后面的语句。
continue:用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环判定。 continue只能用在循环里,跳过循环体中剩余的语句而执行下一次循环。
return:从当前方法退出,返回到调用该方法的语句处并从该语句的下条语句处继续执行程序。(方法)
返回语句的两种格式:
1、return expression 返回一个值给调用该方法的语句。返回值的数据类型必须和方法声明中的返回值类型一致或是精度低于声明的数据类型。
2、return (1)当方法声明中用void声明返回类型为空是,应使用这种返回类型,它并不能返回任何值。
(2)返回一个值给调用该方法的语句,返回值的数据类型必须和方法声明中的返回值类型一致或是精度低于声明的数据类型。
递归算法(recursion)
程序调用自身的编程技巧称为递归。一个过程或函数在其定义或说明中有直接或间接调用自身的方法。
特点:(1)一个问题可被分解为若干层简单的子问题。
(2)子问题和其上层问题的解决方案一致。
(3)外层问题的解决依赖子问题的解决。
递归结构
两部分:1、递归结束条件:什么时候并调用自身方法,如果没有条件将陷入死循环。
2、递归体:什么时候需要调用自身方法。
优点:简单的程序。
缺点:(1)递归调用会占用大量的系统堆栈,内存耗用多。
(2)在递归调用层次多时速度要比循环慢的多。
使用场合:任何可用递归解决的问题也能使用迭代解决,当递归方法可以更加自然地反映问题,并易于理解和调试,并且在强调效率问题时可以采用递归。
注:在要求高性能的情况下尽量避免使用递归,递归既花时间又耗内存。