Hier ist eine rekursive Funktion, die möglicherweise das ist, was Sie brauchen. Die Idee ist, bei Angabe einer Länge und eines Buchstabens zuerst alle Sequenzen zu erzeugen, die einen Buchstaben kürzer sind und diesen Buchstaben nicht enthalten. Fügen Sie den neuen Buchstaben an das Ende und Sie haben den ersten Teil der Sequenz, die diesen Brief enthält. Dann bewege den neuen Buchstaben nach links. Durchlaufen Sie jede Buchstabenfolge einschließlich die neue auf der rechten Seite.
Also, wenn Sie gen hatte (5, d) Es würde beginnen mit
(aaaa)d
(aaab)d
...
(cccc)d
dann, wenn es mit den AC-Kombinationen hinbekommen würde es dann
(aaa)d(a)
...
(aaa)d(d)
(aab)d(d)
...
(ccc)d(d)
tun, wenn es hinbekommen mit d als 4. Schreiben ist es in den 3.
(aa)d(aa)
usw. bewegen, usw.
<?php
/**
* Word Combinations (version c) 6/22/2009 1:20:14 PM
*
* Based on pseudocode in answer provided by Erika:
* http://stackoverflow.com/questions/1024471/generating-ordered-weighted-combinations-of-arbitrary-length-in-php/1028356#1028356
* (direct link to Erika's answer)
*
* To see the results of this script, run it:
* http://stage.dustinfineout.com/stackoverflow/20090622/word_combinations_c.php
**/
init_generator();
function init_generator() {
global $words;
$words = array('a','b','c');
generate_all(5);
}
function generate_all($len){
global $words;
for($i = 0; $i < count($words); $i++){
$res = generate($len, $i);
echo join("<br />", $res);
echo("<br/>");
}
}
function generate($len, $max_index = -1){
global $words;
// WHEN max_index IS NEGATIVE, STARTING POSITION
if ($max_index < 0) {
$max_index = count($words) - 1;
}
$list = array();
if ($len <= 0) {
$list[] = "";
return $list;
}
if ($len == 1) {
if ($max_index >= 1) {
$add = generate(1, ($max_index - 1));
foreach ($add as $addit) {
$list[] = $addit;
}
}
$list[] = $words[$max_index];
return $list;
}
if($max_index == 0) {
$list[] = str_repeat($words[$max_index], $len);
return $list;
}
for ($i = 1; $i <= $len; $i++){
$prefixes = generate(($len - $i), ($max_index - 1));
$postfixes = generate(($i - 1), $max_index);
foreach ($prefixes as $pre){
//print "prefix = $pre<br/>";
foreach ($postfixes as $post){
//print "postfix = $post<br/>";
$list[] = ($pre . $words[$max_index] . $post);
}
}
}
return $list;
}
?>
Ich warf einen Blick auf meine Beispielliste für die Länge zwei und erkannte, dass es in meinem Beispiel einen großen Fehler gab. Ich habe die Frage mit der richtigen Liste bearbeitet. – defines
Gerade die richtige Liste für Länge 3 hinzugefügt, hoffentlich wird es einen Einblick in die Reihenfolge geben, die ich brauche. – defines
Ich habe den Titel geändert, weil dies definitiv keine Breiten-zuerst-Traversierung ist. Ich habe zu lange auf völlig unverwandten Code gestarrt, als ich das gepostet habe;) – defines