递归问题
2015-12-05 14:46
246 查看
Q1:在m个球中取n个球,求一共有多少种取法?
A1:思路:设置一个特殊球(可以想象成幸运球),然后取法划分为:包不包含你的幸运球。
</pre><pre name="code" class="java"><pre name="code" class="java"> public static void main(String[] args) { int result = f(10,3); System.out.println(result); } /** * 从m个球中取n个球 * @param m * @param n * @return */ private static int f(int m, int n) { //解法:取一个特殊球x球,分为取x球和不取x球两种情况递归 if(m < n) return 0; if(m == n) return 1; if(n == 0) return 1; return f(m-1,n-1) + f(m -1 ,n); }
Q2:求字符串的反串 "cba" -> "abc"
A2: 用题目中的这个例子演示,我们需要求cba的返串,可以这样解:求ba(cba的子串)的反串 + c(cba的首字符)。
<pre name="code" class="java"> public static void main(String[] args) { String str = new Scanner(System.in).nextLine(); System.out.println(f(str)); } private static String f(String str) { if(str == null || str.length() < 2) return str; return f(str.substring(1)) + str.charAt(0); }
Q3:杨辉三角问题 求任意层任意位置上的数
1
1 1
1 21
1 331
1 4 641
A4:可以看得出来三角形中外围都是1,其他的都是等于这个数字上一层的与其相邻的两个数字的和
<pre name="code" class="java"> public static void main(String[] args) { System.out.println(f(4,2)); } /** * 第i层的第j个数 * @param i * @param j * @return */ private static int f(int i, int j) { if(j == 0) return 1; if(i == j) return 1; return f(i-1,j-1) + f(i-1,j); }
A5:求m个A和n个B的排列种数
Q5:为了降低规模我们设置成两种情况a.首字母为A,b.首字母为B
</pre><pre name="code" class="java"><pre name="code" class="java"> public static void main(String[] args) { System.out.println(f(3,3)); } /** * m个A和n个B * @param m * @param n * @return */ private static int f(int m, int n) { if(m== 0 || n==0) return 1; return f(m-1,n) + f(m,n-1); }
从上面五个小栗子中得到的启发:
a.递归的关键是发现逻辑的“相似性”
1.如果说没有明显的相似性,我们需要主动的构造
2.不能形成相似性的原因很可能是缺少参数
b.千万不要忘记递归的“出口”,否则不小心就死循环了
c.递归的参数一定得有变化且递归的规模得变低,比如说:切割的思想
相关文章推荐
- [TwistedFate]图片异步加载,KVO
- pycharm 中文
- mac vim 使用记录
- 教你如何配置Ubuntu用于高效、高质量的发送邮件
- IOS 高效利用Xcode
- Spark核心概念
- Servlet生命周期和JSP
- cookie 和session 的区别详解
- 重定向和MySql插入中文
- dede 两个网站共用一个数据库图片路径问题
- web性能测试基本性能指标
- 动态规划--最长递增子序列
- String家族--String、StringBuffer、StringBuilder
- ACM-ICPC Live Archive Regionals 2014 >> 重拾2014上海区域赛
- Unity3D_NGUI_安卓APK安装包瘦身实践
- http和servlet输出
- Git 服务器 配置
- WaitForSingleObject http://www.cnblogs.com/shootingstars/archive/2004/07/15/24602.html
- trunc函数
- ubuntu 下安装 activate-power-mode