在PHP中递归查找组合

时间:2011-03-13 21:07:32

标签: php algorithm

我有以下结构:
A 3
B 2
C 2
D 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 个答案:

答案 0 :(得分:1)

你最想要的是用O((n ^ 2-n)/ 2)生成所有组合,然后将它与第二个数组进行比较,你想要的是在Javascript中查看我的例子。 Array Waypoints保存您的第一个Array。 Array 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]);
    }
   } 

答案 1 :(得分:0)

分隔不同级别并使用排列: lexicographic ordering