-
- function Rank($base, $temp=null)
- {
- $len = strlen($base);
- if($len <= 1)
- {
- echo $temp. $base.'
';
- }
- else
- {
- for($i=0; $i< $len; ++$i)
- {
- rank(substr($base, 0, $ i).substr($base, $i+1, $len-$i-1), $temp.$base[$i]);
- }
- }
- }
- rank('123');
- ?> ;
コードをコピー しかし、結果を何度もテストした結果、同じ要素がある場合、配置全体が繰り返されるという問題があることがわかりました。
たとえば、「122」には「122」、「212」、「221」の 3 つの配置しかありませんが、上記の方法が繰り返されます。
わずかな変更を加え、重複を識別するためのフラグを追加すると、問題は解決されます。
- function fsRank($base, $temp=null)
- {
- static $ret = array();
- $len = strlen($base);
- if($len < = 1)
- {
- //echo $temp.$base.'
';
- $ret[] = $temp.$base;
- }
- else
- {
- for($i=0; $i{
- $had_flag = false;
- for($j{
- if($base[$i] = = $base[$j])
- {
- $had_flag = true;
- break;
- }
- }
- if($had_flag)
- {
- Continue;
- }
- fsRank(substr($base, 0, $i). substr($base, $i+1, $len-$i-1), $temp.$base[$i]);
- }
- }
- return $ret;
- }
- print '
'; </li>
<li>print_r(fsRank('122'));</li>
<li>print ' ';
- ?>
コードをコピー
全配列の再帰アルゴリズムを紹介します。PHP配列の非再帰アルゴリズムの実装コードを紹介します。 |