#php
#php
Вопрос:
Я не уверен почему, но я создал функцию, и почему-то она никогда ничего не возвращает. Предполагается, что она возвращает случайное число, сгенерированное с помощью функции mt_rand(). Я изменил код и попытался запустить его на ideone, а в результатах указано ошибка времени выполнения, сигнал 11 (SIGSEGV)
Может кто-нибудь сказать мне, что с этим не так?
<?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
?>
Комментарии:
1. Это требует базовой отладки. Если ничего не возвращается, это, вероятно, потому, что
$name
есть> 0
. Что содержат$name
,$N
и$max
?2. Разве ваши рекурсивные вызовы breedingTree() не должны возвращать значения? В противном случае, как значение будет распространяться обратно?
3. Некоторые указатели на области вашего кода могут быть проблематичными — (1) рекурсивная функция с SQL-запросом в ней может быть довольно плохой для производительности, если вы часто повторяете (2) включение php-файла в вашу функцию охватит всю вашу функцию и выполнит весь код в этом php-файле внутри вашей функции.
4. Я бы также подозревал, что вызов mysql_query не будет работать на ideone.
5. @MarkBiek Спасибо, решил еще один фрагмент рекурсивного кода, который я писал 🙂
Ответ №1:
Что, если $N
не 0, 1, 2 или 3, или если ($N < $max AND $name > 0)
, или если ($N >= max AND $name > 0)
? Для этих путей к коду нет return
инструкции.
Комментарии:
1. $ N никогда не достигнет значения выше 4 на самом деле. Потому что $ max будет указан только в диапазоне от 0 до 4. И $ s и $ d ($name) в конечном итоге достигнут 0. Я попытался заменить эти возвраты echo(). И код, кажется, работает просто отлично. Это повторяет случайное число, но функция return() ничего не вернула.
2. @Kemal: Хорошо. Но вы должны иметь эти пути к коду assert, или выдавать исключение, или что-то в этом роде, чтобы документировать, что они не могут произойти. Но это все еще оставляет тот факт, что внутри нет инструкции return
if ($N < $max AND $name > 0)
…3. Хорошо, спасибо. Я поместил операторы return внутри первого оператора if, и теперь это работает!