PHP编程挑战 - 代码生成器不接受

时间:2013-07-28 15:01:08

标签: php recursion

您将获得PHP中的数组,其中包含正整数和/或递归嵌套的正整数数组。例如,它可以初始化为:

$arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404)));

编写一个函数“function MaxArray($ arr)”,它返回$ arr中包含的最大值或嵌套在$ arr中的某个数组。在示例中,返回的值应为404.

function MaxArray($arr){

    static $x = 0;

    foreach($arr as $array){ 

        if(is_array($array)) $x = MaxArray($array);            
        else if($array > $x) $x = $array;

    }
    return $x;    
}

//additional output just for testing
$arr = array(array(141,5651,161), 2, 45446, array(101, 202, array(303,4)));
//additional output just for testing
print MaxArray($arr);

每次运行它都有效但在线代码生成器不接受。这是一个错误还是我...?

另外在个人说明中,我想对stackoverflow上的所有人说谢谢,这样一个了不起的网站。四年前我对编程一无所知,现在我从头开始构建这个audio visual reviews,我正在用java编写android应用程序!

更新: 这个问题取自我参加的在线测试。没有显示错误信息,但代码生成器只是给出了错误答案的响应。因此,我没有标记这个问题。

我想在上诉之前检查我的解决方案。

2 个答案:

答案 0 :(得分:1)

# so... this works well enough
$arr = array(array(141,5651,161), 2, 45446, array(101, 202, array(303,4)));
print MaxArray($arr);  // outputs 45446

print "\n";

# but now...let's try it again.  In the same script.  *gasp!*
$arr2 = array(42);
print MaxArray($arr2);  // outputs 45446 (!!!)

问题是静态变量;在调用函数之间没有清除它。所以以前的结果会影响未来这几乎肯定是不正确的,肯定会让知识渊博的人类法官拒绝你的代码。

摆脱静态变量。您可以将其作为参数传递,您可以简单地与子结果进行比较,就像这里建议的其他答案一样......或者您可以使用闭包和array_walk_recursive来展示。 :)

function MaxArray($arr) {
    $max = -1;
    array_walk_recursive($arr, function($x) use (&$max) {
        if ($x > $max) $max = $x;
    });
    return $max;
}

答案 1 :(得分:0)

<?php
$arr = [[141, 151, 161], 2, 3, [101, 202, [303, 404]]]

/**
 * @param $input
 * @return int
 */
function getActMax($input)
{
    if ( ! is_array($input))
    {
        return $input;
    } else
    {
        return findMax($input);
    }
}

/**
 * @param array $inputs
 * @return int
 */
function findMax(array $inputs)
{
    //Maybe the first item in the list is the biggest, this is our current max value
    $max = getActMax(current($inputs));
    foreach ($inputs as $v)
    {
        //If we found a bigger, change our max value
        if (getActMax($v) > $max)
        {
            $max = getActMax($v);
        }
    }

    return (int)$max;
}

var_dump(findMax($arr));