求助:实现接收单个正整数、生成1和3的n位全排列的代码问题
解决你的全排列输出问题
我来帮你搞定这个困扰!你的代码思路是对的,但核心问题出在没有把当前已经拼接好的前缀传递给递归调用,再加上print和println混用,才导致输出结果混乱。
问题分析
你定义的x是方法内部的空字符串,每次递归调用permutation(n-1)时,并没有把当前已经拼好的字符(比如第一次的"1")传进去。举个例子,当n=2时:
- 你先
print("1"),然后调用permutation(1),这时候permutation(1)里的x还是空,所以直接输出1和3——这就变成了11和3(因为print没换行,println换了行)。 - 回到n=2的逻辑,再
print("3"),调用permutation(1)又输出1和3,就变成了31和3。
这就是为什么你得到的结果是11 3 31 3,而不是预期的四个完整的两位排列。
修正后的代码
我们需要新增一个辅助方法,用来传递当前已经拼接好的前缀字符串,这样递归的时候就能累积之前的字符:
public static void permutation(int n) { // 对外保持原接口,内部调用带前缀参数的辅助方法 permutationHelper(n, ""); } private static void permutationHelper(int n, String prefix) { if (n == 1) { // 拼接最后一位并打印 System.out.println(prefix + "1"); System.out.println(prefix + "3"); } else { // 递归拼接"1",把更新后的前缀传下去 permutationHelper(n - 1, prefix + "1"); // 递归拼接"3",把更新后的前缀传下去 permutationHelper(n - 1, prefix + "3"); } }
关键修改点
- 新增辅助方法:
permutationHelper多了一个prefix参数,专门用来保存当前已经拼好的字符串前缀,递归时把新拼接的字符附加到前缀上传递下去。 - 统一输出方式:用
println让每个排列单独占一行,输出更清晰(如果想要空格分隔,把println改成print,并在每个结果后加空格即可)。 - 保持原接口兼容:对外的
permutation方法还是只接收int参数,不需要修改调用方式。
验证结果
当调用permutation(2)时,输出会是:
11 13 31 33
完全符合你的预期!如果输入n=3,也会正确输出8个三位排列,每个都是由1和3组成的完整字符串。
内容的提问来源于stack exchange,提问作者Solumn
相关产品推荐
相关产品推荐

