Функция всегда возвращает null

#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, и теперь это работает!