经典递归问题
1.取球问题:在n个球中,任意取m个(不放回),求有多少种不同取法。
- 对于递归问题来说,该题似乎没有突破口,那么就需要发挥想象。
- 带入一组简单的数字,比如3个中取2个球,将所有可能的组合枚举出来,观察这些组合可以如何划分。比如abc三个球,有ab,ac,bc三种,可以想象n个球中取1个幸运球,那么要么取到该球,要么取不到。
- 如果取到了这个特殊球, 则:f(n-1,m-1),总数总是要减1, 因为取到了特殊球, 所以m-1, 反之没有取到特殊球, 则 f(n-1,m) 总数还是减1, 但是m的值不变。此时,所有取法即为f(n-1,m-1)+f(n-1,m)
- 递归的形式出来之后,就需要考虑出口问题。
import java.util.Scanner;
public class Main {
public static int f(int n, int m) {
//出口判断
if (n < m)//不可能取到
return 0;
if (n == m)
return 1;
if (m == 0)//这个不能落下,否则会栈溢出;判断是否取到最后
return 1;
return f(n - 1, m - 1) + f(n - 1, m);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int k = f(n, m);
System.out.println(k);
}
}
2.求n个元素的全排列
//求n个元素的全排列
public class Main {
// 将每一个元素放到第1个位置(需要进行回溯,不能覆盖掉任何一个元素),再将后面的元素进行全排列
// 递归方法来打印不需要返回什么,void
public static void f(char[] data, int k) {
//递归的出口,如果关注点到了最后一个位置就需要打印了
if (k == data.length) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}