上次有关递归的内容我给忘记了,今天补上。
首先课程修正了我对于递归代码的一个误区。以前的我总是想自己去分解每一个递归步骤,然而这些具体的步骤实施计算机显然更擅长。作为开发人员,只要遇到递归,只需要找出相应的递归关系,总结出递归公式就可以了。
使用递归算法的三个条件:
一个问题的解可以分为几个问题的解
这个问题与分解之后的子问题除了数据规模不同外,求解方法完全相同
存在递归终止的条件
编写递归代码的两个步骤:
找出递归公式
找出初始条件
下面以比较基础的斐波那契数列为例:
另外,使用递归是应警惕堆栈溢出和重复计算。每递归一次,临时变量都会被压入内存栈(因为要后进先出),一直不断压栈有溢出的风险。可以通过直接限制堆栈的深度来解决,当深度超过是拒绝入栈。对于重复计算可以用散列表来记录已经计算过的数据,每次计算前先查询是否计算过。