生成长度为N的所有数字排列

模板男孩:

我正在尝试制作一种模式,其中以每种可能的顺序显示N个数字0-9。

class Main {
  public static void perms(int[] arr, int i) {
    if (i == arr.length) {
      for (int j=0; j<arr.length; j++)
        System.out.print(arr[j] + " ");
      System.out.println();
      return;
    }

    for (int j=i; j<arr.length; j++) {
      for (int k=0; k<=9; k++) {
        arr[j] = k;
        perms(arr, j+1);
      }
    }
  }

  public static void main(String[] args) {
    perms(new int[]{0,0}, 0);
  }
}

这是我正在寻找长度2的数组的输出:

0 0  
0 1  
0 2  
0 3  
0 4  
0 5  
0 6  
0 7  
0 8  
0 9  
1 0  
1 1  
1 2  
1 3  
1 4  
1 5  
1 6  
1 7  
1 8  
1 9   
2 0  
2 1  
2 2  
2 3  
2 4  
2 5  
2 6  
2 7  
2 8  
2 9   
3 0  
3 1  
3 2  
3 3  
3 4  
3 5  
3 6  
3 7  
3 8  
3 9  
4 0  
4 1  
4 2  
4 3  
4 4  
4 5  
4 6  
4 7  
4 8  
4 9  
5 0  
5 1  
5 2  
5 3  
5 4  
5 5  
5 6  
5 7  
5 8  
5 9  
6 0   
6 1  
6 2   
6 3  
6 4  
6 5  
6 6  
6 7  
6 8  
6 9  
7 0  
7 1  
7 2  
7 3  
7 4  
7 5  
7 6  
7 7  
7 8  
7 9  
8 0  
8 1  
8 2  
8 3  
8 4  
8 5   
8 6  
8 7  
8 8  
8 9  
9 0   
9 1  
9 2  
9 3  
9 4  
9 5   
9 6  
9 7  
9 8  
9 9  

它可以工作,但是有以下额外输出:

9 0  
9 1  
9 2  
9 3  
9 4  
9 5  
9 6  
9 7  
9 8  
9 9   

在我运行它的最后。为什么会发生这种情况,我该如何摆脱呢?

王迪伦:

我对递归函数的建议是,您应该始终绘制一个图来模拟您的编码过程。为您编程:在此处输入图片说明

然后,您可以简单地注意到,level 1in loop k > 9您已经打印了所需的所有数字时,程序并没有停止,而是out loop j进入1并开始下一个循环。这就是您多吃钱的原因{9, 0~9}

要了解为什么会发生这种情况,请在此循环(请参阅级别1)中,when j == 1变量arr = {9, 9}(来自上一次循环操作when out loop j == 0)。也就是说,内部循环arr[j] = k正在修改数组中的第二个变量arr[1]此操作与相同level 2

一种可能的解决方案:

public class Main {
  public static void perms(int[] arr, int i) {
    if (i == arr.length) {
      for (int j=0; j<arr.length; j++)
        System.out.print(arr[j] + " ");
      System.out.println();
      return;
    }

    for (int j=i; j<arr.length; j++) {
      for (int k=0; k<=9; k++) {
        arr[j] = k;
        perms(arr, j+1);
      }

      // if arr = {9, 9}, break;
      // this cannot put above the inner loop, I will 
      // leave that for you to think why
      if(arr[0] == 9 && arr[1] == 9){
        return;
      }
    }
  }

  public static void main(String[] args) {
    perms(new int[]{0,0}, 0);
  }
}

或检查此答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何生成长度为n的Java中的SecureRandom的字符串?

生成总数为N的所有数字排列

生成所有长度为n的True / False排列?

生成一定长度的所有排列

生成n个随机数,其总和为m,所有数字均应大于零

如何在Matlab的极限[m,n]中随机生成所有数字?

如何在Postgres 9.6+中生成长度为N的随机,唯一的字母数字ID?

通过步骤m生成长度为n的可迭代滑动窗口

如何找到给定数字的所有数字的排列,使其最接近目标数字

用\ n +数字+ \ n替换所有数字

去除长度小于或等于6的所有数字

如何从Python列表中生成所有可能的数字排列?

VBA-将所有数字排列写入数组

为python生成除整数以外的所有数字

递归生成所有数字总和为n的k位数字

如何从带有条件的字母表中生成长度为N的所有单词

kdb / q:生成长度为N的所有可能的“字符串”

如何在Prolog中使用DCG生成长度为n-1的所有二进制字符串的语言

从给定的单词列表中生成长度为“ N”的所有可能组合(寻找不重复)

生成所有n个字母的排列

查找长度为k的向量的所有非等价排列,并取n个可能值

生成长度为6的字母和数字的所有可能组合时出现MemoryError

将1到N的所有数字相加,并将设置的位数设置为2

生成所有XOR为N的数字对

从 N 生成长度 K 的所有无序排列的快速算法

如何在python中生成值为n的两个数字的所有可能排列?

可以再次用作数字的所有数字的排列

使用来自 {1,2,...N} 的元素生成所有长度为 M (1<M<10) 的数字,其中 N(1<N<20)

npm jsonwebtoken 模块生成长度为 10 000 的令牌