递归 - 算法的实现

时间:2015-03-13 06:14:40

标签: java algorithm

我正在尝试理解用于查找Permutations of a String

的此算法

如果你已经过了最后一个位置

- Print the string
- Return

否则

- For each letter in the input string
- If it’s marked as used, skip to the next letter
- Else place the letter in the current position
- Mark the letter as used
- Permute remaining letters starting at current position + 1
- Mark the letter as unused



以下是此算法的Java实现:

public class Permutations {
   private boolean[] used;
   private StringBuilder out = new StringBuilder();
   private final String in;

   public Permutations( final String str ){
     in = str;
     used = new boolean[ in.length() ];
  }

  public void permute( ){
     if( out.length() == in.length() ){
     System.out.println( out );
     return;
 }
     for( int i = 0; i < in.length(); ++i ){
       if( used[i] ) continue;   ------------------- // This line
       out.append( in.charAt(i) );
       used[i] = true;
       permute();
       used[i] = false;
       out.setLength( out.length() - 1 );
      }
   }
}


除了注释为This line的行之外,我可以理解代码的其他部分。它是如何工作的?

4 个答案:

答案 0 :(得分:0)

如果您问continue如何运作:

来自The continue Statement

  

continue语句跳过for,while或do-while循环的当前迭代。未标记的表单跳到最内层循环体的末尾,并计算控制循环的布尔表达式。

在您的程序中,您正在初始化used = new boolean[ in.length() ];,因此默认情况下此数组中的所有值都将为false。

来自if( used[i] ) continue;如果used[i]的当前值为ture表示已处理,则会跳过当前迭代并继续下一步。

答案 1 :(得分:0)

您突出显示的行的目的是, 代码检查位置'i'的字符是否已被使用。如果它已被使用,则continue(即直接进入for循环的下一次迭代)。

等同于

for( int i = 0; i < in.length(); ++i ){
      if(!used[i] ) {
          out.append( in.charAt(i) );
          used[i] = true;
          permute();
          used[i] = false;
          out.setLength( out.length() - 1 );
      }
}

希望这有帮助!

祝你好运!

答案 2 :(得分:0)

continue将跳过当前循环体并从循环中的起始点迭代并再次检查条件再次进入循环。 在你的代码中

for( int i = 0; i < in.length(); ++i ){
   if( used[i] ) continue;   ------------------- // This line
   out.append( in.charAt(i) );
   used[i] = true;
   permute();
   used[i] = false;
   out.setLength( out.length() - 1 );
  }

如果used[i] == true那么下面的所有行继续语句将不会执行当前迭代。 control将转到循环语句中的condition语句。

答案 3 :(得分:0)

它只是跳过if块下的语句执行并继续迭代下一个i值。