您的位置:首页 > 其它

未名湖的烦恼的递归问题

2017-03-19 16:14 176 查看
未名湖的烦恼

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

  每天早上,租鞋窗口都会排起长龙,假设有还鞋的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
4000
[] 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); // 当下一位为借鞋子的人时

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: