Java置换程序说明

Java置换程序说明,java,permutation,Java,Permutation,对于某些人来说,这个问题似乎很基本,但我一直在分析和剖析这段代码,但没有成功,因为Robert Sedgewick的这个程序如何在不使用system.out.print的情况下打印单词或字符的组合,而使用perm1和perm2方法。非常感谢对假人的任何帮助或解释。先谢谢你 这是链接下的代码: public class Permutations { // print N! permutation of the characters of the string s (in order) pu

对于某些人来说,这个问题似乎很基本,但我一直在分析和剖析这段代码,但没有成功,因为Robert Sedgewick的这个程序如何在不使用system.out.print的情况下打印单词或字符的组合,而使用perm1和perm2方法。非常感谢对假人的任何帮助或解释。先谢谢你

这是链接下的代码:

public class Permutations {
  // print N! permutation of the characters of the string s (in order)
  public  static void perm1(String s) { perm1("", s); }
  private static void perm1(String prefix, String s) {
      int N = s.length();
      if (N == 0) System.out.println(prefix);
      else {
          for (int i = 0; i < N; i++)
             perm1(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, N));
      }
  }
  // print N! permutation of the elements of array a (not in order)
  public static void perm2(String s) {
     int N = s.length();
     char[] a = new char[N];
     for (int i = 0; i < N; i++)
         a[i] = s.charAt(i);
     perm2(a, N);
  }

  private static void perm2(char[] a, int n) {
      if (n == 1) {
          System.out.println(a);
          return;
      }
      for (int i = 0; i < n; i++) {
          swap(a, i, n-1);
          perm2(a, n-1);
          swap(a, i, n-1);
      }
  }  

  // swap the characters at indices i and j
  private static void swap(char[] a, int i, int j) {
      char c;
      c = a[i]; a[i] = a[j]; a[j] = c;
  }

  public static void main(String[] args) {
     int N = Integer.parseInt(args[0]);
     String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
     String elements = alphabet.substring(0, N);
     perm1(elements);
     System.out.println();
     perm2(elements);
  }
}
公共类置换{
//打印N!字符串s的字符排列(按顺序)
公共静态void perm1(字符串s){perm1(“,s);}
私有静态void perm1(字符串前缀,字符串s){
int N=s.长度();
如果(N==0)System.out.println(前缀);
否则{
对于(int i=0;i
就在那里:

if (N == 0) System.out.println(prefix);

System.out.print
System.out.println
基本相同,只是后者在文本后打印换行符。

这是一个糟糕的代码。使用
String
concatenations-evil命名函数和变量。但它确实使用了它们,只在第二次重载时使用。你知道它的其余部分是如何工作的,对吧?@Sulthan它可能不是一个著名递归置换算法的幼稚Java实现。典型的课堂代码。我以为我理解了它的其余部分,但看到Matzi的评论,我开始怀疑我的分析是否正确。我知道这只是一个课堂代码,但我对它的工作方式更感兴趣。dimas,添加
System.out.println(“前缀”+前缀+;“s”+s”)将有助于您理解
作为
perm1(字符串,字符串)
中的第一行。然后您就可以跟踪递归调用了。谢谢您的回复,我想只有当N等于零时,行才会输出前缀?这意味着没有检测到输入?这是一个递归函数调用,N总是递减并最终达到零,函数打印并终止。