我的排列代码每次都打印 nPn 吗?
My permutation code prints nPn every time?
所以我正在尝试编写一个代码,它将按照 nPr 方式打印出字符串的所有排列,其中 n 是字符串长度,r 是输入。它接受一个前缀和字符串,以及一个整数。它这样做除了它每次打印 nPn 排列而不是 nPr 排列。
public static void main(String[] args){
String x = "abcd";
permu("", x, 2);
}
public static void permu(String pre, String x, int r){
if(x.length() == 0)
System.out.println(pre.substring(0, r));
else{
for(int i = 0; i < x.length(); i++)
permu(pre + x.charAt(i), x.substring(0, i) + x.substring(i + 1, x.length()), r);
}
}
对于 r = 2,我希望它打印 ab、ac、ad、ba、bc、bd、ca、cb、cd、da、db、dc。但它会打印两倍的内容。
您必须将递归限制设置为 r
(现在是 n
)。大概是这样:
if(x.length() == 0)
change to
if(pre.length() == r)
结果不会让您感到惊讶:您的代码决定了所有 24 种排列。它仅在打印时强制执行最大长度。你可以看出这一点,因为 r
除了打印之外没有在任何地方使用。
如果打印整个字符串,结果为:
abcd
abdc
acbd
acdb
....
您只能看到本质上是完整排列的前几个字符。
如果您想从 4 个中真正挑选 2 个,您应该在挑选 r
项后停止递归:
if (pre.length() == r)
System.out.println(pre.substring(0, r));
您可能想确保代码在有人使用大于字符串长度的 r
调用它时仍然有效:
if (pre.length() == r || x.length() == 0)
System.out.println(pre.substring(0, r));
所以我正在尝试编写一个代码,它将按照 nPr 方式打印出字符串的所有排列,其中 n 是字符串长度,r 是输入。它接受一个前缀和字符串,以及一个整数。它这样做除了它每次打印 nPn 排列而不是 nPr 排列。
public static void main(String[] args){
String x = "abcd";
permu("", x, 2);
}
public static void permu(String pre, String x, int r){
if(x.length() == 0)
System.out.println(pre.substring(0, r));
else{
for(int i = 0; i < x.length(); i++)
permu(pre + x.charAt(i), x.substring(0, i) + x.substring(i + 1, x.length()), r);
}
}
对于 r = 2,我希望它打印 ab、ac、ad、ba、bc、bd、ca、cb、cd、da、db、dc。但它会打印两倍的内容。
您必须将递归限制设置为 r
(现在是 n
)。大概是这样:
if(x.length() == 0)
change to
if(pre.length() == r)
结果不会让您感到惊讶:您的代码决定了所有 24 种排列。它仅在打印时强制执行最大长度。你可以看出这一点,因为 r
除了打印之外没有在任何地方使用。
如果打印整个字符串,结果为:
abcd
abdc
acbd
acdb
....
您只能看到本质上是完整排列的前几个字符。
如果您想从 4 个中真正挑选 2 个,您应该在挑选 r
项后停止递归:
if (pre.length() == r)
System.out.println(pre.substring(0, r));
您可能想确保代码在有人使用大于字符串长度的 r
调用它时仍然有效:
if (pre.length() == r || x.length() == 0)
System.out.println(pre.substring(0, r));