Algorithmusprinzip
Wenn P die vollständige Anordnung von n Elementen darstellt und Pi die vollständige Anordnung von n Elementen darstellt, die das Element i nicht enthält, (i) bedeutet Pi das Hinzufügen des Präfixes i vor dem Anordnung Pi, dann kann die Gesamtanordnung von n Elementen rekursiv definiert werden als:
① Wenn n=1, dann hat die Anordnung P nur ein Element i;
Gemäß der Definition kann es sein Man sieht, dass, wenn die Anordnung Pi von (k-1) Elementen erzeugt wurde, die Anordnung von k Elementen erzeugt werden kann, indem man vor jedem Pi das Element i hinzufügt.
Code-Implementierung
Code kopieren Der Code lautet wie folgt:
function rank($base, $temp=null)
{
$len = strlen($base);
if ($len <= 1)
{
echo $temp.$base.'
';
}
else
{
for($i =0; $i< $len;
{
rank(substr($base, 0, $i).substr($base, $i+1, $len-$i- 1), $temp.$base[$i]);
}
}
}
rank('123');
Nach vielen Testläufen ist es jedoch Es wurde festgestellt, dass eine Frage vorliegt: Wenn dieselben Elemente vorhanden sind, wird die gesamte Anordnung wiederholt.
Zum Beispiel gibt es nur drei Situationen für die vollständige Anordnung von „122“: „122“, „212“ und „221“, aber die oben genannten Methoden werden wiederholt.
Leicht geändert, ein Flag zum Erkennen von Duplikaten hinzugefügt, das Problem gelöst (der Code lautet wie folgt):
Kopieren Sie den Code. Der Code lautet wie folgt:
function fsRank($base, $temp=null)
{
static $ret = array();
$len = strlen($base);
if($len <= 1)
{
//echo $ temp.$base.'< ;br/>';
$ret[] = $temp.$base;
}
else
{
for($i=0; $i< $len; + +$i)
( > 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>print '';