如何编写函数来输出非常规循环

时间:2010-04-13 04:38:01

标签: php loops recursion

这是功能描述

test($argv)

$argv是一个数组,例如$argv=array($from1,$to1,$from2,$to2.....); 数组项必须是偶数。

$argv=array(1,3,4,5):这将输出如下值:

1_4
1_5
2_4
2_5
3_4
3_5

伪代码就像

while($from1<=$to1){
   while($from2<=$to2){
         echo $from1."_".$from2."<br/>";
        $from2++;
   }
   $from1++;
}

$argv=array(1,2,3,4,5,6):这将输出如下值:

1_3_5
1_3_6
1_4_5
1_4_6
2_3_5
2_3_6
2_4_5
2_4_6

伪代码就像

while($from1<=$to1){
   while($from2<=$to2){
        while($from3<=$to3){
             echo $from1."_".$from2."_".$from3."<br/>";
             $from3++;
        }
        $from2++;
   }
   $from1++;
}

数组$ argv的数量不是常数。 可能会输出3或4级循环。

我刚刚听说将使用尾部回归或迭代,但我不确切知道如何编码。

3 个答案:

答案 0 :(得分:1)

以下是一些功能:     

    header("Content-type: text/plain");

    function testFromTo($args) {
        echo "***** testFromTo *****\n";
        // uses indexes parity to walk the array
        foreach ($args as $k1=>$v1) {
            if (($k1 + 1) % 2 == 1) {
                foreach ($args as $k2=>$v2) {
                    if (($k2 + 1) % 2 == 0) {
                        echo $v1 . "_" . $v2 . "\n";
                    }
                }
            }
        }
    }

    function testHalf($args) {
        echo "***** testHalf *****\n";
        // cuts $args in two parts
        $args1 = array_slice($args, 0, count($args) / 2);
        $args2 = array_slice($args, count($args) / 2);

        foreach ($args1 as $v1) {
            foreach ($args2 as $v2) {
                echo $v1 . "_" . $v2 . "\n";
            }
        }
    }


    $argv = array(1, 2, 3, 4, 5, 6);
    testFromTo($argv);
    testHalf($argv);

    exit;
?>

及相关产出:

***** testFromTo *****
1_2
1_4
1_6
3_2
3_4
3_6
5_2
5_4
5_6
***** testHalf *****
1_4
1_5
1_6
2_4
2_5
2_6
3_4
3_5
3_6

答案 1 :(得分:1)

以下功能应该做你想要的。它不会打印结果,而是返回一个数组,其中包含可以迭代并打印它的结果。

$testArray = array('1', '3', '4', '5');
$testArray2 = array('1', '2', '3', '4', '5', '6');

function test($a) {
  $from1 = array_shift($a);
  $to1 = array_shift($a);

  $result = array();

  while ($from1 <= $to1) {
    if (sizeof($a) > 0) {
      $rest = test($a);
      foreach ($rest as $b) {
        $result[] = $from1.'_'.$b;
      }

    } else {
      $result[] = $from1;
    }
    $from1++;
  }
  return $result;
}

print_r(test($testArray));
print_r(test($testArray2));

作为一个建议阅读递归,因为它是一个非常有用的技术。有时很难将它包裹起来,但这是非常值得的。如果我没记错的话,来自麻省理工学院的This book有一个关于递归的伟大章节,它是免费的。玩得开心。

答案 2 :(得分:0)

这样的东西?

test("1", "2", "4", "5", "6", "7", "8", "9");

function test(){
    $args = func_get_args();
    $cnt = func_num_args();
    //echo "cnt :: " . ($cnt % 2) . "\n";

    if(($cnt % 2) > 0) return false;

    $split = $cnt / 2;
    list($list1, $list2) = array_chunk($args, ($cnt / 2));
foreach($list1 as $idx=>$val){
    foreach($list2 as $idx2=>$val2){
        echo $list1[$idx] . "_" . $list2[$idx] . "\n";
    }
}       
}

这是输出:

1_6
1_6
1_6
1_6
2_7
2_7
2_7
2_7
4_8
4_8
4_8
4_8
5_9
5_9
5_9
5_9