您的位置:首页 > 其它

递归问题

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.递归的参数一定得有变化且递归的规模得变低,比如说:切割的思想
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: