2011-04-30 221 views
0

我不知道爲什麼,但我創建了一個函數,並以某種方式它永遠不會返回任何東西。 它應該返回使用mt_rand()函數生成的隨機數。 我修改了代碼,並試圖在ideone運行它,結果說運行時錯誤信號11(SIGSEGV)函數總是返回null

誰能告訴我有什麼錯呢?

<?php 
    function breedingTree($name, $N, $max) 
    { 
     include('config.php'); 
     if ($N < $max AND $name > 0) 
     { 

      $sql = 'SELECT sire, dam 
        FROM '.$prefix.'owned_adoptables 
        WHERE aid = "'.$name.'"'; 
      $res = mysql_query($sql); 
      list($s, $d) = mysql_fetch_row($res); 
      if (mt_rand(0,1) === 1) breedingTree($s, $N+1, $max); 
      else breedingTree($d, $N+1, $max); 

     } 
     elseif ($name <= 0) 
     { 

      if ($N === 0) return mt_rand(1,100); 
      elseif ($N === 1) return mt_rand(5,95); 
      elseif ($N === 2) return mt_rand(15,85); 
      elseif ($N === 3) return mt_rand(25,75); 

     } 

    } 

echo breedingTree(355, 0, 4); // Return nothing 
echo breedingTree(0, 0, 4); // Return random number between 1 - 100 
?> 
+0

這需要進行基本的調試。如果沒有返回,可能是因爲'$ name'是'> 0'。 '$ name','$ N'和'$ max'包含什麼? – 2011-04-30 14:20:35

+3

不要遞歸調用breedingTree()需要返回值嗎?否則,價值將如何傳播回來? – 2011-04-30 14:21:45

+0

您的代碼可能存在問題的一些指針 - (1)如果遞歸函數與SQL查詢在其中可能會非常糟糕的性能,如果你遞歸很多(2)包括在你的函數中的PHP文件將範圍一切到你的函數和在你的函數中執行該php文件中的所有代碼。 – 2011-04-30 14:23:35

回答

1

如果$N不爲0,1,2,或3,或如果($N < $max AND $name > 0),或者如果($N >= max AND $name > 0)?這些代碼路徑沒有return語句。

+0

$ N實際上永遠不會達到4以上。因爲$ max只會在0到4之間指定。而$ s和$ d($ name)最終會達到0.我嘗試用echo()替換那些返回值。代碼似乎工作得很好。它回顯隨機數,但返回()沒有返回任何東西。 – 2011-04-30 14:26:21

+0

@凱馬爾:好的。但是你應該讓這些代碼路徑斷言,或者拋出一個異常或其他東西來記錄它們不會發生。但是,這仍然會導致'if($ N <$ max AND $ name> 0)'裏面沒有return語句...... – 2011-04-30 14:30:11

+0

好的謝謝。我把return語句放在第一個if語句中,現在它正在工作! – 2011-04-30 14:38:38