所以我对递归的想法很新,我写了这个简单的代码来计算一个数字($ 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
所以我的问题是为什么它会在完成之前停止?
答案 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)
我的例子中有两件事你错了:
return factor($n, $y + 1);
)仅在$dec == ''
时发生。否则,该功能只是退出。这就是$y
为7时停止的原因。$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);