Рекурсивно найти комбинации в PHP - PullRequest
1 голос
/ 14 марта 2011

У меня есть следующая структура:
А 3
Б 2
С 2
Д 1
E 0

В то время как буквы представляют фактическое значение элемента, цифры представляют уровень элемента. Я хочу иметь возможность вывести следующее:

A B D E
A C D E

код, который у меня есть сейчас, не выполняет работу должным образом, и мне нужно найти рекурсивный способ решения проблемы. Любая помощь будет очень признательна.

<?php

// An array that holds the values
$values = array();
$values[] = "A";
$values[] = "B";
$values[] = "C";
$values[] = "D";
$values[] = "E";


// An array that holds the levels
$levels = array();
$levels[] = 3;
$levels[] = 2;
$levels[] = 2;
$levels[] = 1;
$levels[] = 0;

// We are asuming that 3 is the heighest level
$startingLevel = 3;


// this array will holds all combinations. each group is seperated by a |
$results = array();


for($i = 0; $i < count($values); $i++)
{
    $thisValue = $values[$i];
    $thisLevel = $levels[$i];

    if($thisLevel == $startingLevel)
    {
        $results[] = $thisValue;
        $j = 0;
        $k = $i;
        $limit = $thisLevel;        

        while($j < $thisLevel)
        {
            if($levels[$k] < $limit)
            {
                $results[] = $values[$k];
                $limit = $levels[$k];
                $j++;
            }

            $k++;
        }

            // separating groups by |
        $results[] = "|";
    }

}


// Show results
print_r($results);

?>

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Скорее всего, вам нужно сгенерировать все комбинации с помощью O ((n ^ 2-n) / 2), а затем сравнить их со вторым массивом, а также посмотреть на мой пример в Javascript. Массив путевых точек содержит ваш первый массив. Массив wayStr содержит ваше решение. Тогда вам нужно всего лишь перебрать решение и сравнить его со вторым массивом.

function getWayStr(curr) {
   var nextAbove = -1;
   for (var i = curr + 1; i < waypoints.length; ++i) {
     if (nextAbove == -1) {
       nextAbove = i;
     } else {
        wayStr.push(waypoints[i]);
        wayStr.push(waypoints[curr]);
     }
    }
    if (nextAbove != -1) {
      wayStr.push(waypoints[nextAbove]);
      getWayStr(nextAbove);
      wayStr.push(waypoints[curr]);
    }
   } 
0 голосов
/ 14 марта 2011

Разделите различные уровни и используйте перестановку: lexicographic ordering

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...