PHP рекурсивный факторинг ошибок - PullRequest
0 голосов
/ 17 февраля 2012

, поэтому я новичок в идее рекурсии, и я написал этот простой код для вычисления числа ($ 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 ]

5 голосов
/ 17 февраля 2012

Ваш следующий шаг будет 120/7, что равно 17.142857 ....

Таким образом, эта проверка не проходит и рекурсия как таковая не происходит:

if($dec=='') // $dec would equal to 142857.....
{
    echo'x:'.$x.' y:'.$y.'</br>';
    return factor($n,($y+1));
}
2 голосов
/ 17 февраля 2012
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));
    }
}

ЧАСТЬ ДЕСЯТИЧНОГО ОГРАНИЧЕНИЯ

1 голос
/ 17 февраля 2012

Есть две вещи, которые я вижу неправильно в вашем примере:

  1. Ваша рекурсия останавливается при первом обнаружении дробного значения.Хвостовая рекурсия (return factor($n, $y + 1);) происходит только при $dec == ''.В противном случае функция просто завершается.Вот почему он останавливается, когда $y равен 7.
  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);
...