1.函数递归定义
程序调用自身的编程技巧称为递归。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略 只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小
函数递归实际上是一种思想方法,是将函数重复调用自身的操作。需要我们不断练习。
2.函数递归的条件
(1)存在限制条件,当满足这个限制条件的时候,递归便不再继续。
(2)每次递归调用之后越来越接近这个限制条件。
如果不存在限制条件和不接近限制条件就会实现死递归的情况的出现,也就是栈溢出的情况,通俗点就是内存不够用了。
3.函数递归的例子
(1)接受一个整型值(无符号),按照顺序打印它的每一位。
以下就利用函数递归的思想实现了按顺序打印 他的每一位。可以描述成这样的示意图,-
但是只要表示成类似这种形式就能递归
(2)编写函数不允许创建临时变量,求字符串的长度
在忽略条件时我们可以使用以下代码来编写
同样的,我们也可以使用递归的方法来
根据上面所说,我们可以同样也能使用来表示。
因此我们只要列出上面类似于分段数列的形式就能实现递归,在上面求n!的方式就使用了数列中的递推公式。所以我们只要发现解决问题的部分共性,从而得到递推公式,在区分不同情况,做到递归的两个必要条件,就能实现递归。
4. 递归与迭代
先介绍两个例子
求n的阶乘。
求第n个求第n个斐波那契数。
迭代就是一种类似循环的思想。
上面斐波那契数当使用递归时计算会变得极其复杂,如果我们使用迭代的方法来进行计算就会变得方便快捷迅速。
因此,递归与迭代是两个相互互补的两种思想。
下面介绍一些解决栈溢出的办法:
1. 将递归改写成非递归。
2. 使用static对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 nonstatic 局部对象(即栈对象),这不 仅可以减少每次递归调用和返回时产生和释放 存递归调用的中间状态,并且可为 各个调用层所访问。