You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:实现接收单个正整数、生成1和3的n位全排列的代码问题

解决你的全排列输出问题

我来帮你搞定这个困扰!你的代码思路是对的,但核心问题出在没有把当前已经拼接好的前缀传递给递归调用,再加上print和println混用,才导致输出结果混乱。

问题分析

你定义的x是方法内部的空字符串,每次递归调用permutation(n-1)时,并没有把当前已经拼好的字符(比如第一次的"1")传进去。举个例子,当n=2时:

  1. 你先print("1"),然后调用permutation(1),这时候permutation(1)里的x还是空,所以直接输出1和3——这就变成了11和3(因为print没换行,println换了行)。
  2. 回到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");
    }
}

关键修改点

  1. 新增辅助方法:permutationHelper多了一个prefix参数,专门用来保存当前已经拼好的字符串前缀,递归时把新拼接的字符附加到前缀上传递下去。
  2. 统一输出方式:用println让每个排列单独占一行,输出更清晰(如果想要空格分隔,把println改成print,并在每个结果后加空格即可)。
  3. 保持原接口兼容:对外的permutation方法还是只接收int参数,不需要修改调用方式。

验证结果

当调用permutation(2)时,输出会是:

11
13
31
33

完全符合你的预期!如果输入n=3,也会正确输出8个三位排列,每个都是由1和3组成的完整字符串。

内容的提问来源于stack exchange,提问作者Solumn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:58:10