2010-03-27 2 views
2

Я разработкой алгоритма, чтобы получить перестановки какможно ли динамически устанавливать уровень для цикла гнездования

123 
132 
213 
231 
312 
321 

Я делаю это с помощью вложенных циклов по каждому элементу.

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

Проблема в том, что те из вложенных циклов оптимизированы для трехпозиционных перестановок. Как я могу динамически установить число вложенных циклов для генерации 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

Вы можете использовать рекурсивную функцию. Взгляните на это post.

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

Смежные вопросы