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

Krishna

Продался Java
амый показательным для меня был пример рекурсивного вычисления факториала.
+1
triumvirat
Выйти из стека - с помощью исключений, как ты и говорил, они для того и созданы. Только скорее всего у тебя просто неправильная архитектура этого куска, если тебе такое понадобилось в штатной ситуации.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Угу. Одна проблема, линейным умножением вычислить факториал на порядки производительней, чем рекурсивной функцией. И как практически с любым рекурсивным алгоритмом - он тупо жрет очень много ресурсов.
 

rotoZOOM

ACM maniac
triumvirat Реальный абсолютно. Выходи по цепочке.
(почти псевдокод)
PHP:
public function findFile ($curdir, $file)
{
     foreach ($curdir as $f)
     {
           if (is_file($f)){
                if ($f==$file)return $f;
           }else if (is_dir($f)){
                $ret=$this->findFile ($f,$file);
                if ($ret!==false)return $f.'/'.$ret;
           }
     }
     return false;
}
флоппик Факториал - это пример на понимание рекурсии. Надеюсь разводить холивар не будем относительно того, что лучше рекурсия или линейные алгоритмы? :)
 

Krishna

Продался Java
флоппик
И как практически с любым рекурсивным алгоритмом - он тупо жрет очень много ресурсов.
Ересь.
На примере факториала - конечно рекурсия будет медленнее цикла, слишком проста операция умножения по сравнению с вызовом функции, но это же чисто учебный пример.

triumvirat
поиск файла в иерархии директорий и выход(include файла) по факту нахождения - вроде бы реальный пример.
1. Разделяешь поиск файла и собственно инклюд.
2. Поиск реализуешь путём рекурсивного вызова своей функции для всех дочерних (на 1 шаг глубже) поддиректорий
в цикле. Если функция возвращает false - цикл продолжается, если string с путём к файлу - break и return этого значения. (Это если не предполагается поиск нескольких файлов) После цикла проверяешь наличие файла в текущей директории и возвращаешь false или строку с путём.

Кстати, для этих целей есть итератор директорий в SPL - можно поюзать, я правда пока на практике не применял.

-~{}~ 11.03.09 17:43:

rotoZOOM
фак :)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Реквестирую пример в опровержение.

-~{}~ 11.03.09 20:53:

Надеюсь разводить холивар не будем относительно того, что лучше рекурсия или линейные алгоритмы?
Нет конечно. Надо знать и уметь обоих )
 

Krishna

Продался Java
Если я буду сочинять пример для опровержения всех абсурдных утверждений - у меня не останется времени на сон и на еду.

Но как пример вполне сойдет задачка топикстартера. Если ты мне продемонстрируешь превосходство производительности нерекурсивного подхода над рекурсивным для данной задачи - я долго буду цокать языком :)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Кстати, при пользовании рекурсивными фунциями, разумно в них передавать ссылку на результирующую переменную (массив), чем рекурсивно собиирать кучу данных через return

-~{}~ 11.03.09 22:38:

Krishna, признаю, задачу ТСа выгодней решать рекурсией, тем более, что данных он никаких в стек за собой не таскает.
 
Сверху