2010-03-27 2 views
2

중첩 루프 내가 중첩 된 foreach는 루프를 사용하고 있어요은 가능한 동적

123 
132 
213 
231 
312 
321 

같은 순열을 얻기 위해 알고리즘을 일하고의 수준을 설정하는 것입니다.

for (..) { 
    for(..) { 
     for(..) { 
      echo $i . $j . $k . "<br />"; 
     } 
    } 
} 

중첩 루프의 수는 3 자리 순열에 최적화되어 있습니다. 중첩 된 루프의 수를 4 문자 또는 5 문자 순열을 생성하도록 동적으로 설정할 수 있습니까?

답변

2

재귀 메서드는 이동하는 방법입니다. 하지만 eval 같은 기능을 사용할 수도 있습니다 :

$loop = iteration('i',10) . iteration('j',10). iteration('k',10). iteration('l',10); 
$loop .= "print \"\$i \$j \$k \$l\\n\";"; 

// $loop now has: for($i=0;$i<10;$i++)for($j=0;$j<10;$j++)for($k=0;$k<10;$k++)for($l=0;$l<10;$l++) print "$i $j $k $l\n"; 
eval($loop); 

function iteration($var,$limit) { 
    return "for(\${$var}=0;\${$var}<$limit;\${$var}++)";  
} 
0

대답은 다음과 같습니다. 재귀 함수 사용

0

재귀 함수를 사용할 수 있습니다. 이을 살펴보십시오.

4

그래, 그냥 재귀 적으로.

function permuteThis($items, $permutations = array()) { 

    if(!is_array($items)) 
     $items = str_split($items); 

    $numItems = sizeof($items); 

    if($numItems > 0) { 
     $cnt = $numItems - 1; 
     for($i = $cnt; $i >= 0; --$i) { 
      $newItems = $items; 
      $newPerms = $permutations; 
      list($tmp) = array_splice($newItems, $i, 1); 
      array_unshift($newPerms, $tmp); 
      permuteThis($newItems, $newPerms); 
     } 
    } else { 
     echo join('', $permutations) . "\n"; 
    } 
} 

$number = 123; 
permuteThis($number); 
1

아니요, 아니요, 순열 생성에 재귀를 사용하지 마십시오. here 개요 알고리즘을 사용하십시오. php implementation

도 참조하십시오.
관련 문제