我正在做一个 Java 作业,我完全被难住了。
问题是:
使用递归编写一个函数来执行以下操作:您有 X 张不同的卡片。你只有 Y 个信封。Y 小于或等于 X。对于 X 和 Y 的任何给定值,
当订单不重要且不允许重复时,显示您可以填写 Y 信封的所有可能方式。
hint: X! / (( X-Y)! * Y!)
当订单很重要且允许重复时,显示您可以填写 Y 信封的所有可能方式
hint: X^Y
当订单很重要且不允许重复时,显示您可以填写 Y 信封的所有可能方式提示:
X! / (X – Y)!
当顺序不重要且允许重复时,显示所有可能的方式来填充 Y 信封提示:
(X + Y – 1)! / (Y! * (X – 1)!)
例如,在情况 (1) 下,if X = {J, Q, K, A) and Y = 3
输出应为:{J,Q,K} {J,Q,A} {J,K,A} {Q,K,A}.
我不希望任何人发布任何代码,我也不想找人帮我解决这个问题!我希望一旦我完成了第一部分(问题a),它将打开闸门。有人可以在制定伪代码算法方面提供一些指导吗,据我所知:
用增加的卡片依次填充 Y 信封 用最高的卡片(ex: X=5, Y=3) {1, 2, 3}.
替换最高的信封{1, 2, 5}
,递减直到我们找到它的原始值{1, 2, 4}
。对从最高到最低的每个信封执行此操作(其中数字尚未使用){1, 5, 4} {1, 3, 4} {5, 3, 4} {2, 3, 4}.
这是我在它崩溃之前得到的,因为它缺少 3 个组合{1, 5, 3} {3, 4, 5} {5, 3, 2}.
我将不胜感激任何帮助,因为这是我将重复的任务,我不想要解决方案,我需要帮助自己解决问题。谢谢!
编辑:我已经尝试了概述的所有 3 种解决方案,但我仍然没有得到它。这就是我到目前为止所得到的:
public static void comboNoRep(String[] a, int y, boolean[] used)
{
if(y == 0) {
// found a valid solution.
System.out.println(result);
}
for(int i=0; i<a.length; i++) {
if(!used[i]) {
used[i] = true;
result = result + a[i];
comboNoRep(a, y - 1, used);
result = result + " ";
used[i] = false;
}
else {
}
}
}
谁能帮忙指出我的缺点?