как правильно выйти из рекурсивной функции?

Духовность™

Продвинутый новичок
как правильно выйти из рекурсивной функции?

сабж. подумываю кинуть исключение. больше вариантов нет. return тут не помогает.
 

DiMA

php.spb.ru
Команда форума
приведи свой кривой код, исправим, ретурн заработает .-)
 

Духовность™

Продвинутый новичок
а ну да, это мой косяк был, работает.

но тем не менее, я не пойму, а почему работает? Разве каждая функция вызываемая сама собой не является самостоятельным объектом в памяти?...
 

Krishna

Продался Java
Разве каждая функция вызываемая сама собой не является самостоятельным объектом в памяти
Нет конечно.
Функция это не данные, это кусок кода. Рекурсивное выполнение это просто запуск того же куска кода, но с другими параметрами и вызванный из него же.
Это если отвечать на твой вопрос дословно. А не дословно - хз что ты имел ввиду.

-~{}~ 11.03.09 15:01:

А вообще, return не должен "помогать" в плане выхода сразу изо всего стека функций. Иначе рекурсия не имела бы никакого практического смысла. Так что хз про что тут вообще речь, даешь пример кода )
 

Krishna

Продался Java
Я тебе уже сказал - код давай, чего я тут гадать буду?
Причем не "как есть", а максимально урезанный, самостоятельно работающий test case, который я смогу у себя запустить и вместе с тобой поудивляться результатам :)
 

Духовность™

Продвинутый новичок
А вообще, return не должен "помогать" в плане выхода сразу изо всего стека функций
PHP:
$array = array
(
    111, 222, 333, array
    (
        111, 222, 333, array
        (
            111, 222, 333, array
            (
                111, 222, 333, array
                (
                    111, 222, 333, 444, array
                        (
                            111, 222, 333, 
                        )
                )
            )
        )
    )
);

search($array);

function search($in)
{
    if ($in)
    {
        foreach ($in as $key => $value)
        {
            if (is_array($value))
            {
                search($in[$key]);
            }
            else
            {
                echo "$value == 444: ".(int)($value == 444).'<br>';

                if ($value == 444)
                {
                    return;
                }
            }
        }
    }

    return $in;
}
 

dimagolov

Новичок
triumvirat, а в чем смысл в том, что ты иногда возвращаешь результат, а иногда нет, при этом никогда его не используешь?
при чем учитывая, что нифига в полученном массиве ты не меняешь возвращать его же выглядит слегка излишним ;)

и ты что, хочешь добиться? чтобы находило совпадение не более одного раза?
 

Духовность™

Продвинутый новичок
dimagolov
я ничего не хочу добиться. я не понимаю, почему return выбрасывает из всего стека функций.
 

Krishna

Продался Java
Похоже на какую-то жесть :)
В чём задача этой функции русским языком?

Думаю, ты просто неправильно интерпретируешь то, что на самом деле происходит. Попробуй выводить debug_backtrace перед return.
 

rotoZOOM

ACM maniac
triumvirat ты не прав. Ретурн не выбрасывает сразу из всего стека. Возьми карандаш и пошагово поработай php интерпретатором над своим кодом, попутно записывая на бумажку в таблицу, что у тебя хранится на стеке.
Либо поставь echo в начале входа в функцию и перед каждым ретурном.
 

DiMA

php.spb.ru
Команда форума
в качестве домашнего задания:
напиши рекурсивную функцию сложения $a и $b, используя только оператор ++ и if
("+" или цикл юзать нельзя)

function add($a, $b) ..
 

Духовность™

Продвинутый новичок
rotoZOOM
да я ошибся. Ретурн не выбрасывает сразу из всего стека. Тогда вопрос остается в силе - как правильно выйти из рекурсивной функции, из всего стека?
 

DiMA

php.spb.ru
Команда форума
оперотором - никак
головой:

return array(флаг, полезные данные типа $in)

и по всему коду: если флаг строит - ретурн
 

rotoZOOM

ACM maniac
triumvirat Это не правильный вопрос. Рекурсия - это как стек кода (ну примерно), ты же не можешь из стека достать предпредпоследнее значение, минуя предыдущие два? (Юзать тока операции push и pop). Так же и тут. Если ты нашел результат, то и возвращай его ретурном по цепочке вызовов.
P.S. DiMA а оператор -- можно?
 

DiMA

php.spb.ru
Команда форума
конечно можно.. это просто самый простой показательный пример по замене цикла на рекурсию (ну и ради дела: + на ++)
 

rotoZOOM

ACM maniac
DiMA Условия тогда ставь точнее, а то людей пугаешь :)
используя только оператор ++ и if
-~{}~ 11.03.09 18:19:

P.S. самый показательным для меня был пример рекурсивного вычисления факториала. По-моему проще некуда. Может начать с этого?
 

DiMA

php.spb.ru
Команда форума
не кул-программеры знают, что такое факториал .-)
поэтому сумма двух чисел попроще будет
 
Сверху