ホームページ  >  記事  >  バックエンド開発  >  PHP の完全に配置された再帰アルゴリズム コード

PHP の完全に配置された再帰アルゴリズム コード

高洛峰
高洛峰オリジナル
2016-12-01 14:55:481234ブラウズ

アルゴリズム原理

P が n 個の要素の完全な配置を表し、Pi が要素 i を含まない n 個の要素の完全な配置を表す場合、 (i) Pi は、配置 Pi の前に接頭辞 i を付けた配置を表します。 n 要素の全体の配置は次のように再帰的に定義できます。
① n=1 の場合、配置 P には要素 i が 1 つだけあります
② n>1 の場合、全体の配置 P は配置 (i) Pi で構成されます。この定義によれば、(k-1) 個の要素の順列 Pi が生成されている場合、各 Pi の前に要素 i を追加することで k 要素の順列を生成できることがわかります。
コードの実装
コードをコピーする コードは次のとおりです:
function Rank($base, $temp=null)
{
$len = strlen($base);
if($len {
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]);
複数回テストを実行した結果、問題があることが判明しました。問題: 同じ要素がある場合、配置全体が繰り返されます。
たとえば、「122」の完全な配置には「122」、「212」、「221」の 3 つの状況しかありませんが、上記の方法が繰り返されます。
少し変更し、重複を識別するためのフラグを追加し、問題を解決しました(コードは次のとおりです):
コードをコピーします コードは次のとおりです:
function fsRank($base, $temp=null)
{
static $ret = array();
$ len = strlen($base);
if($len {
//echo $temp.$base.'
';
$ret[ ] = $temp.$base ;
}
else
{
for($i=0; $i< $len; ++$i)
{
$had_flag = false;
for($j=0; $ j<$i ++ $j)
break;
}
}
}
if($had_flag)
continue;
}
fsRank(substr($base, 0, $i).substr($base, $ i+1, $len-$i-1), $temp.$base[$i]); return $ret;
}
print '

';<br>print_r(fsRank('122')); <br>「
」を印刷します;

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。