0

所以我对递归的想法很陌生,我写了这个简单的代码来分解一个数字($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

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

4

3 回答 3

5

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

所以这个检查失败,因此递归不会发生:

if($dec=='') // $dec would equal to 142857.....
{
    echo'x:'.$x.' y:'.$y.'</br>';
    return factor($n,($y+1));
}
于 2012-02-17T01:17:37.523 回答
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));
    }
}

小数限制的一部分

于 2012-02-17T01:34:04.873 回答
1

我认为您的示例有两点错误:

  1. 您的递归在第一次遇到小数值时停止。尾递归 ( return factor($n, $y + 1);) 仅在$dec == ''. 否则,函数简单地退出。这就是为什么它在 7 时停止$y
  2. 您结束递归 ( $y > $n) 的条件不正确。您希望在除数大于商时(即何时)中断递归,$y > $x因为这意味着您已经找到了所有整数因子。

我认为这就是你想要的:

$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);
于 2012-02-17T01:38:35.347 回答