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));
    }
}

10 進制限の一部

于 2012-02-17T01:34:04.873 に答える
1

あなたの例には2つの間違いがあります。

  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);
于 2012-02-17T01:38:35.347 に答える