public class A {
/**
* n个球中选m个,的种类数
* @param n
* @param m
* @return
*/
private static int f1(int n, int m) {
if (m == n || m <= 0)
return 1;
return f1(n - 1, m - 1) + f1(n - 1, m);
}
/**
* 求n个元素全排列
* @param data
* @param k 当前的交换位置
*/
private static void f2(char[] data, int k) {
if (k == data.length)
System.out.println(String.valueOf(data));
for (int j = k; j < data.length; j++) {
// 第k个和第j个交换位置---试探
{
char t = data[k];
data[k] = data[j];
data[j] = t;
}
f2(data, k + 1);
// 第k个和第j个交换位 ----回溯
{
char t = data[k];
data[k] = data[j];
data[j] = t;
}
}
}
/**
* 求两个串的最长公共子序列
* @param str1
* @param str2
* @return
*/
private static int f3(String str1, String str2) {
if (str1.length() == 0 || str2.length() == 0)
return 0;
if (str1.charAt(0) == str2.charAt(0)) {
return f3(str1.substring(1), str2.substring(1)) + 1;
}
return (int) (Math.max(f3(str1.substring(1), str2),
f3(str1, str2.substring(1))));
}
/**
* 字符串反转 如:"abc"---"cba"
* @param x
* @return
*/
private static String f4(String x) {
if (x == null || x.length() < 2)
return x;
return f4(x.substring(1)) + x.charAt(0);
}
/**
* 杨辉三角
* @param m
* @param n
* @return
*/
private static int f5(int m, int n) {
if (m == 0)
return 1;
if (n == 0 || n == m)
return 1;
return f5(m - 1, n) + f5(m - 1, n - 1);
}
/**
* 有m个A,有n个B有多少中排列方式
* @param m
* @param n
* @return
*/
private static int f6(int m, int n) {
if (m == 0 || n == 0)
return 1;
return f6(m - 1, n) + f6(m, n - 1);
}
/**
* 整数划分问题
* @param n 对n进行划分
* @param a 缓存
* @param k 当前的位置
*/
private static void f7(int n, int a[], int k) {
if (n == 0) {
for (int i = 0; i < k; i++) {
System.out.print(a[i]);
if (i != k - 1) {
System.out.print("+");
}
}
System.out.println();
return;
}
for (int i = n; i > 0; i--) {
if (k > 0 && i > a[k - 1])
continue;
a[k] = i;
f7(n - i, a, k + 1);
}
}
}
经典递归例题
最新推荐文章于 2024-08-16 09:16:07 发布