2017-10-25 10 views
0

以下は、置換を見つけるためのヒープアルゴリズムに基づくPHP関数です。この関数はJavaScriptでは問題なく動作しますが、PHPでは失敗します。どうして ?次のように関数のPHPでのヒープアルゴリズムの実装が間違った結果をもたらす

function generate($n,$A) { 
    if ($n === 1) { 
     var_dump($A); 
     return $A; 
    } else { 
     for ($i = 0; $i < $n - 1; $i++) { 
      generate($n - 1, $A); 
      if ($n % 2 === 0) { 
       $t = $A[$i]; 
       $A[$i] = $A[$n - 1]; 
       $A[$n - 1] = $t; 
      }else { 
       $t = $A[0]; 
       $A[0] = $A[$n - 1]; 
       $A[$n - 1] = $t; 
      } 
     } 
     generate($n - 1, $A); 
    } 
} 

generate(3,array('a','b','c')); 

出力は次のようになります。

[ "a", "b", "c" ], 
[ "b", "a", "c" ], 
[ "c", "a", "b" ], 
[ "a", "c", "b" ], 
[ "b", "c", "a" ], 
[ "c", "b", "a" ], 

が、私は得る:

ここ
[ "a", "b", "c" ], 
[ "b", "a", "c" ], 
[ "c", "b", "a" ], 
[ "b", "c", "a" ], 
[ "a", "b", "c" ], 
[ "b", "a" ,"c" ] 
+0

予想される結果であり、どのような/あなたは実際に何を得ていますか? – Phil

+0

**本当に**私の質問に答えることはありません。また、余分な情報を追加するためにコメントを使用しないでください。あなたの質問を編集してください。 – Phil

答えて

0

あなたが行く:

function swap(&$x, &$y) { 
    list($x, $y) = array($y, $x); 
} 

function generate($n, &$A) { 
    if($n === 1) { 
     echo "<pre>"; 
     print_r($A); 
     echo "</pre>"; 
     return $A; 

    } else { 

     for($i = 0; $i < $n - 1; $i++) { 
      generate($n - 1, $A); 
      if(($n % 2) === 0) { 
       swap($A[$i], $A[$n - 1]); 

      } else { 
       swap($A[$n - 1], $A[0]); 
      } 
     } 
     generate($n - 1, $A); 
    } 
} 

$A = array('a','b','c'); 
generate(3, $A); 
+0

より優れた可変スワッピングテクニックは、私が逃したトリックです。私を正しい方向に向けてくれてありがとう。 – swww

関連する問題