递归与循环:
理论上,任何循环都可以重写为递归形式。
- 有时候,为栈限制,需要“尾递归”。
- java不支持尾递归。
有些语言没有循环语句,只能使用递归。
循环改递归:
改为递归的关键是发现逻辑的“相似性”。
不要忘记递归的“出口”。
构造相似性:
- 如果没有明显的相似性,需要主动构造。
- 不能相似的原因很可能是缺少参数。
- 递归与数学上的递推公式类似。
递归调用:
- 递归调用紧紧是被函数恰为的函数。
- 注意每次调用的层次不同。
- 注意每次分配形参并非同一个变量。
- 注意返回的次序。
示例1,求和:
1 | public class ArraySum { |
示例2,字符串比较:
1 | public class IsSameString { |
经典的递归问题
组和问题:
题目:在n个球助中,任意取出m个(不放回),求有多少中不同的取法。
1 | public class 组和问题 { |
全排列问题:
题目:求n个元素的全排列。
1 | public class 全排列 { |
最大公共序列:
题目:求两个串的最大公共子序列的长度。
1 | public class 最大公共子序列 { |
求反串:
题目:求串的反转,如:abcd转换后为dcba。
1 | public class 求反串 { |
杨辉三角:
1 | public class 杨辉三角 { |
排列:
题目:3个A,2个B有多少种排列方法?
1 | public class 排列组合 { |
整数的划分问题:
题目:如对正整数n=6;可以划分为:
- 6
- 5+1
- 4+2,4+1+1
- 3+3, 3+2+1, 3+1+1
- 2+2+2, 2+2+2+1, 2+1+1+1+1
- 1+1+1+1+1+1
1 | public class 整数的划分 { |