2012-02-17 44 views
0

所以我在遞歸的思路新,我寫了這個簡單的代碼來因子的數字($ N)這是代碼:PHP遞歸誤差融通

$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 

所以我的問題是爲什麼在它完成之前停止?

回答

5

你的下一步將是七分之一百二十零相當於17.142857 ....

所以這個檢查失敗,因此遞歸不會發生:

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

它發生是因爲我把回報率($ N,($ Y + 1));在if語句中,當我應該放在if和else之外時 – jkdba 2012-02-17 01:22:09

+0

@JohnK如果你希望它繼續循環,直到達到遞歸限制($ y> $ n),那麼你應該打破這條線返回if語句。 – fayerth 2012-02-17 01:29:17

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

DECIMAL限制的部分

1

有兩件事情我看錯你的榜樣:

  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); 
+0

當心除以0。 – ccKep 2012-02-17 01:43:01