Lizard-108
@Lizard-108
Ящерица

Функция вызывает сама себя и через несколько тактов «падает», что можно с этим сделать?

Есть функция. Выглядит примерно так
function func() {
	if ($какое_то_условие) {
		//какой нибудь код
	} else {
		func();	 // запускаем функцию опять
	}
}

Все бы ничего, но через некоторое количество тактов функция падает и выдает ошибку, мол памяти не хватает.

Как можно решить эту проблему? Мне надо чтобы фунция таки работала до победного конца, даже если там 1000 тактов будет.
  • Вопрос задан
  • 243 просмотра
Решения вопроса 1
@vshvydky
переменные в функции живут до окончания ее исполнения, то есть все переменные каждой функции родителя будут живы до тех пор, пока вы не закончите исполнение самой глубокой функции и не начнете подыматься наверх и дропать все данные. Я бы , если конечно очень требуется рекурсия, делал следующее, код будет немного абстрактный.
function func($array) {
  if ($какое_то_условие для выхода) {
    //какой нибудь код
  } else {
создаем объекты, проводим манипуляции, типо
$aaa = new SuperPuperClass();
$bbb=$aaa->getBigData;
далее грохаем $aaa , $bbb пушим в наш массив данных и тоже грохаем, далее передаем массив дальше в функцию
    func(array);	 // запускаем функцию опять
  }
}

Однако, надо понимать, что в памяти будет висеть такое зло функция ([1]) -> функция ([1,2]) .... -> функция([1,2....,N])
Чуть облегчить себе жизнь можно вынеся массив на уровень объявления функции, пусть он будет для нее глобальным. Тогда пушить или попать из него будет можно откуда угодно и он не будет дублироваться. А вообще, если есть возможность отработать через фор, лучше не делать рекурсию.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Adamos
@Adamos
Рекурсии сплошь и рядом можно развернуть в цикл.
Однако если она у вас уже через несколько тактов падает, вы, видимо, создаете в ней кучу новых объектов, которые ей приходится хранить до конца рекурсии?
Так с пыхом нельзя...
Ответ написан
Комментировать
Чистить память как вариант. Обнулять переменные после отработки.
Ответ написан
Комментировать
@bkosun
Используйте генераторы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы