未名湖的烦恼的递归问题

未名湖的烦恼


每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。

  每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)

输入格式 

两个整数,表示m和n

输出格式  

一个整数,表示队伍的排法的方案数。样例输入3 2样例输出5数据规模和约定  m,n∈[0,18]

以下是网上大牛们贴出的代码:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		System.out.println(fun(m, n));
	}

	public static int fun(int m, int n) {
		if (m < n)
			return 0;
		if (n == 0)
			return 1;
		
		return fun(m - 1, n) + fun(m, n - 1);

	}

}

我一直都不能很清楚的理解这行代码:

return fun(m - 1, n) + fun(m, n - 1);

在网上也没看到大牛们清晰的解释,反倒是看到很多人解释的意思完全不一样???

正好我刚学会一丢丢dfs,嘿嘿,本着现学现卖的原则我就用dfs做了一遍,各种yy,见笑:


import java.util.Scanner;

//dfs
public class Main {
	static int[] mk = new int[100];
	static int count = 0;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		dfs(m, n);
		System.out.println(count);
	}

	public static void dfs(int m, int n) {
		if (m < n || m < 0 || n < 0) // 当借鞋子的人数大于还鞋子的人数时排序方法为0(同时解决边界问题)
			return;
		if (n == 0) { // 当借鞋子的人数为0时,只有一种排序方法。
			count += 1;
			return;
		}
		// 继续向下搜索,从最后一位开始排序。
		dfs(m - 1, n); // 当下一位为还鞋子的人时
		dfs(m, n - 1); // 当下一位为借鞋子的人时

	}
}



猜你喜欢

转载自blog.csdn.net/sdzhr/article/details/63685460
今日推荐