递归函数返回NULL

时间:2019-09-23 14:19:34

标签: php

为了练习编写递归函数,我制作了一个简单的素数计算器。该函数起作用-它确定并以升序​​正确显示最大600,000的任何整数的质数-但它总是返回 NULL。

我知道函数的结构可能不同,等等。-这是我想了解的NULL返回的“原因”!

在下面的代码中,参数如下:

$original - the original value to be tested

$input - the value to be tested in the current iteration

$primes - array of primes

$divisors - array of prime factors determined

function determinePrimeFactors($original,$input,$primes,$divisors=[]) {
    if ( $input !== 1 ) {

        foreach ( $primes as $prime ) {
            $quotient = $input / $prime;
            if ( is_int($quotient) ) {
                $quotients[] = $quotient;
            }
        }

        $quotient = max($quotients);

        $divisors[] = $input / $quotient;

        determinePrimeFactors($original,$quotient,$primes,$divisors);

    } else {
        echo "<h1>RESULT</h1>";
        echo "<p>".implode(" * ",$divisors)." = ".$original."</p>";

        return $divisors;
    }
}

回声输出总是正确的(例如3 * 31 * 823 = 76539)。

我希望该函数返回作为回显输出基础的数组(例如[ 0=>3, 1=>31, 2=>823 ]),但不返回任何内容。

这是为什么?

1 个答案:

答案 0 :(得分:4)

在先前的调用中添加return,以将返回值一直保留到第一次调用,并最终从函数中返回。

return determinePrimeFactors($original,$quotient,$primes,$divisors);

此外,借助以上return,您可以通过删除多余的else部分来使代码更简洁。

function determinePrimeFactors($original,$input,$primes,$divisors=[]) {
    if ( $input !== 1 ) {
        foreach ( $primes as $prime ) {
            $quotient = $input / $prime;
            if ( is_int($quotient) ) {
                $quotients[] = $quotient;
            }
        }

        $quotient = max($quotients);

        $divisors[] = $input / $quotient;

        return determinePrimeFactors($original,$quotient,$primes,$divisors);
    }

    echo "<h1>RESULT</h1>";
    echo "<p>".implode(" * ",$divisors)." = ".$original."</p>";

    return $divisors;
}