《Java黑皮书基础篇第10版》 第18章【笔记】

第十八章 递归

18.1 引言

递归方法是调用自身的方法

本质上来讲,递归和普通的方法没有任何区别,因为他们都是利用Java调用栈后进先出的特性进行工作的。对于普通方法,调用时进栈,完成后出栈;对于递归方法,一个方法内“嵌套”了这个方法,所以调用栈会逐渐累加,最后执行完毕时,一个一个按照后进先出出栈

因此,先理解调用栈的工作原理,再来看递归,就没什么稀奇的了

18.2 示例学习:计算阶乘

18.3 示例学习:计算斐波那契数

18.4 使用递归解决问题

所有的递归方法都具有以下特点:

• 这些方法使用if-else或switch语句来引导不同的情况

• 一个或多个基础情况(最简单的情况)用来停止递归(注意,一个递归方法可以只拥有1个基础情况,而不包含常规代码块,详见编程练习题18.14)

• 每次递归调用都会简化原始问题,让它不断地接近基础情况,直到它变成这种基础情况为止

18.5 递归辅助方法

有时候可以通过针对要解决的初始问題的类似问題定义一个递归方法,来找到初始问題的解决方法。这个新的方法称为递归辅助方法。

18.6 示例学习:得到目录的大小

18.7 示例学习:汉诺塔

18.8 示例学习:分形

18.9 递归与迭代

递归是程序控制的另一种形式,实质上就是不用循环控制的重复

递归会产生相当大的系统开销。程序每调用一个方法,系统就要给方法中所有的局部变量和参数分配空间。这就要占用大量的内存,还需要额外的时间来管理内存

应该根据要解决的问题的本质和我们对这个问题的理解来决定是用递归还是用迭代

18.10 尾递归

如果在从递归调用返回时没有继续的操作要完成,那么这个递归方法就称为尾递归

尾递归更可取:因为当最后一个递归调用结束时,方法也结束,因此,无须将中间的调用存储在栈中。编译器可以优化尾递归以减小栈空间。

你可能感兴趣的:(java,笔记,开发语言)