递归写法总结
问题描述
递归是算法中的一种很重要思想。好的递归程序逻辑清楚,代码简洁,有时候时间上也非常高效;此外链表、二叉树等结构用递归算法一般都有鲜明优势。
往往递归问题口头说起来感觉十分清晰顺畅;而用代码实现起来确总感觉层峦叠嶂,不知从何下手,思路也越来越混乱不堪。
几点总结
最近在解决一些算法相关的小问题时候,经常需要用到递归,有几点感悟。
- 递归的目标,时刻从要得到的结果\目标考虑。
- 当然,递归要把握住从本层到下一层的具体逻辑/代数关系。例如需要各层数值累加;本层的条件不足以判断需求的结果,还需要下一层的条件等。这一般是认为相对简单的。
- 代码中要有明确的在每一层传递变量和返回结果;以使递归持续下去,同时能获取下一级的结果。
- 递归的终止条件。可能是数值超过给定的范围,可能是已经能判断出需要的结果。
- 递归到边界时候的写法统一到递归中。到达容器边界,也会导致递归终止,这就给程序终止带来一定的复杂性。把问题想明白了就很简单,因为在边界上除了有强行终止,还有递归条件目标的终止。
1> 递归的每一层都可能是容器边界,从着手写代码就应该考虑。
2> 列举所有可能的容器边界,判断个边界对应的返回结果。
3> 除容器边界外的情况,都应当是可向下一步递归的。在这个情况下写出符合目标条件的递归关系式。
一个例子
对称树的判别