php递归错误分解

时间:2012-02-17 01:12:42

标签: php recursion factoring

所以我对递归的想法很新,我写了这个简单的代码来计算一个数字($ n)这就是代码:

$n = 120;
$y = 1;

function factor($n, $y) {
    if($y > $n) {
        return 1;
    } else {
        $x = $n / $y;
        list($whole, $dec) = array_pad(explode('.', $x), 2, Null);
        if($dec == '') {
            echo 'x:' . $x . ' y:' . $y . '</br>';
            return factor($n, ($y + 1));
        }
    }
}

这是代码输出的内容:

x:120 y:1
x:60 y:2
x:40 y:3
x:30 y:4
x:24 y:5
x:20 y:6

所以我的问题是为什么它会在完成之前停止?

3 个答案:

答案 0 :(得分:5)

你的下一步将是120/7,等于17.142857 ......

因此,此检查失败,因此递归不会发生:

if($dec=='') // $dec would equal to 142857.....
{
    echo'x:'.$x.' y:'.$y.'</br>';
    return factor($n,($y+1));
}

答案 1 :(得分:2)

else
{
    $x=$n/$y;
    list($whole,$dec)=array_pad(explode('.', number_format($x)), 2, Null);
    if($dec=='')
    {
        echo'x:'.$x.' y:'.$y.'</br>';
        return factor($n,($y+1));
    }
}

部分限制

答案 2 :(得分:1)

我的例子中有两件事你错了:

  1. 您的递归会在第一次遇到小数值时停止。尾递归(return factor($n, $y + 1);)仅在$dec == ''时发生。否则,该功能只是退出。这就是$y为7时停止的原因。
  2. 结束递归($y > $n)的条件不正确。当除数大于商时,你希望打破递归 - 即,当$y > $x时 - 因为这意味着你找到了所有整数因子。
  3. 我认为这就是你想要的:

    $n = 120;
    $y = 1;
    
    function factor($n, $y) {
        $x = $n / $y;
    
        if($y > $x) {
            return 1;
        } else {
            list($whole, $dec) = array_pad(explode('.', $x), 2, Null);
    
            if($dec == '') {
                echo 'x:' . $x . ' y:' . $y . "</br>\n";
            }
    
            return factor($n, ($y + 1));
        }
    }
    
    echo factor($n, $y);