알고리즘 원리
P가 n 원소의 완전한 배열을 나타내고, Pi가 i 원소를 포함하지 않는 n 원소의 완전한 배열을 나타낸다면, (i) Pi는 앞에 접두사 i를 추가하는 것을 의미합니다. Pi 배열의 경우 n 요소의 전체 배열은 다음과 같이 재귀적으로 정의될 수 있습니다.
① n=1이면 배열 P는 단 하나의 요소 i를 갖습니다.
정의에 따르면 다음과 같습니다. (k-1)개의 요소 배열 Pi가 생성된 경우, 각 Pi 앞에 요소 i를 추가하면 k개의 요소 배열이 생성될 수 있음을 알 수 있습니다.
코드 구현
코드 복사 코드는 다음과 같습니다.
함수 순위($base, $temp=null)
{
$len = strlen($base);
if ($len <= 1)
{
echo $temp.$base.'
';
}
else
{
for($i =0; $i< $len; ++$i)
{
순위(substr($base, 0, $i).substr($base, $i+1, $len-$i- 1), $temp.$base[$i]);
}
}
}
rank('123');
그러나 여러 번의 테스트 실행 끝에 질문: 동일한 요소가 있으면 전체 배열이 반복됩니다.
예를 들어 '122'의 전체 배열에는 '122', '212', '221' 세 가지 상황만 있지만 위의 방법이 반복됩니다.
약간 수정, 중복 감지 플래그 추가, 문제 해결(코드는 다음과 같습니다):
코드 복사 코드는 다음과 같습니다:
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< + +$i)
$had_flag [$ i] == $base[$j])
~ ( > 계속;
}
fsRank(substr($base, 0, $i).substr($base, $i+1, $len-$i-1), $temp.$base[$i ]);
}
}
$ret 반환 ;
}
인쇄 '
';<br>print_r(fsRank('122'));<br>인쇄 '';