2012-08-26 21 views
0

这个问题似乎基本到一些人,但我一直在分析和解剖没有成功将该代码作为这个permutation程序由罗伯特·塞奇威克如何打印的文字或字符,而无需使用System.out的组合。在方法perm1和perm2中打印。任何帮助或解释傻瓜非常感谢。先谢谢你。解释Java的程序排列

这是链接下的代码:

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); 
    } 
} 
+0

这是可怕的代码。命名函数和变量,使用'String'连接 - 邪恶。 – Sulthan

+0

但它确实使用它们,只是在它们的第二次重载中。你了解它的其余部分是如何工作的,对吗? – dasblinkenlight

+0

@Sulthan It't可能是一个天真的Java实现一个众所周知的递归置换算法的。典型的课堂代码。 –

回答

2

这是正确的有:

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

System.out.printSystem.out.println基本相同,只是后来的打印文本后换行。

+0

感谢您的回复,如果N等于零,我认为该行只打印出前缀?意思是没有检测到输入? – dimas

+1

它是一个递归函数调用中,N总是减小,并最终达到零,并且该函数打印并终止。 – Matzi