Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP
Войти
Регистрация
Восстановить пароль
 
coolio
0 / 0 / 1
Регистрация: 23.09.2016
Сообщений: 47
1

Рекурсивные функции

28.08.2018, 15:55. Просмотров 194. Ответов 12
Метки нет (Все метки)

привет всем! пытаюсь понять рекурсию, нужна небольшая помощь

подскажите, как сделать рекурсивную функцию чтобы она вызывалась в зависимости от того сколько элементов в массиве.

Например, есть массив $a и в нём 10 элементов.
считаем
PHP
1
$i = count($a);

и простенькая фукция
PHP
1
2
3
function test (){
print "привет<br>";
};

как сделать так, чтобы функция вызывалась столько раз, чему равен i ? то есть напечатать "привет" 10 раз.

И еще вопрос, скажем, фунция какая-нибудь по-сложнее,выполняется дольше и в массиве, к примеру, миллион элементов, а max_execution_time = 180 поможет ли рекурсия избежать ошибки gateway timeout?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2018, 15:55
Ответы с готовыми решениями:

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

Рекурсивные функции
Определите закономерность формирования членов последовательности. Найдите N-ый член...

Как работают рекурсивные функции?
Доброго. Читая документацию я наткнулся на следующий пример (здесь, #6): &lt;?php function...

Рекурсивные и не рекурсивные функции (вычисление суммы всех натуральных чисел от 1 до n)
Всем привет. Заранее извиняюсь за мб глупые вопросы и навязчивость. Но у меня есть одна просьба. ...

Рекурсивные функции, функции высшего порядка, преобразование императивных программ в функциональные
Простые рекурсивные функции для обработки списков: А) (ATOM-LIST x) проверяет, является ли х ...

12
Зверушь
436 / 346 / 91
Регистрация: 01.05.2010
Сообщений: 1,681
28.08.2018, 16:19 2
PHP
1
2
3
4
5
6
7
8
test(count($a));
 
function test(int $i) {
    if ($i > 0) {
        print 'test<br />';
        test(--$i);
    }
}
Добавлено через 1 минуту
Избежать таймаута поможет только увеличение разрешенного времени исполнения, то есть увеличение max_execution_time. Рекурсия тут ни при чем.
1
coolio
0 / 0 / 1
Регистрация: 23.09.2016
Сообщений: 47
28.08.2018, 16:34  [ТС] 3
Зверушь, спасибо большое!)
а если функция вызывается в cron, это всё так же ничего не изменит и всё равно нужно увеличивать max_execution_time?
0
Зверушь
436 / 346 / 91
Регистрация: 01.05.2010
Сообщений: 1,681
28.08.2018, 16:43 4
А какая разница крон не крон?
Но для крон задач кстати, если я не ошибаюсь, лимит на время исполнения отсутствует. Так как по сути крон запускает скрипт через cli.
Но можете проверить. Запустите бесконечный скрипт через cli и посмотрите завершится он или нет. И даже если есть лимит, то всегда есть ini_set()
При чем тут рекурсия?))) Рекурсия - это просто вызов функцией самой себя, не более.

Добавлено через 4 минуты
От миллиона элементов в массиве у вас скорее оперативка крякнет, чем время выйдет))) Особенно, если там объекты.
Такие данные нужно обрабатывать в цикле порционно, не забывая после каждой итерации удалять мусор, который может остаться.
0
coolio
0 / 0 / 1
Регистрация: 23.09.2016
Сообщений: 47
28.08.2018, 16:45  [ТС] 5
Зверушь, надо попробовать в cron.
рекурсия... просто наверное я неправильно понял рекурсию. Я думал так - функция ЗАКАНЧИВАЕТ свою работу, а затем запускается ЗАНОВО. А получается ее выполнение не прекращается до тех пор пока не достигнет i
0
Зверушь
436 / 346 / 91
Регистрация: 01.05.2010
Сообщений: 1,681
28.08.2018, 16:49 6
В данном случае первый вызов функции отработает от начала и до конца программы. Пока все вложенные функции не закончат работу. Но опять таки, max_execution_time - это немного в другие ворота. Это максимально допустимое время выполнения всей программы, а не отдельных функций
0
coolio
0 / 0 / 1
Регистрация: 23.09.2016
Сообщений: 47
28.08.2018, 16:51  [ТС] 7
Зверушь, так вот как раз у меня эта функция и выполняется так долго, что не укладывается во время))
а можно подробнее про ini_set() - как с ее помощью решить проблему с тайм аутом? сейчас глянул на нее и пока что для меня это темный лес
0
Зверушь
436 / 346 / 91
Регистрация: 01.05.2010
Сообщений: 1,681
28.08.2018, 16:55 8
Есть файл php.ini, там есть настройка max_execution_time, ее можно изменить прямо в файле.
Но можно это сделать прямо в скрипте. Напишите первой строчкой:
PHP
1
ini_set("max_execution_time", 3600);
И все, конкретный скрипт сможет работать целый час.

Добавлено через 1 минуту
http://php.net/manual/ru/function.ini-set.php
0
coolio
0 / 0 / 1
Регистрация: 23.09.2016
Сообщений: 47
28.08.2018, 16:55  [ТС] 9
Зверушь, а какие могут возникнуть неприятности если (вдруг, пока только теоретически) на выполнение скрипта потребуется, скажем часов 10 и я увеличу выполнение скрипта на это время?))) чем это чревато?
0
Зверушь
436 / 346 / 91
Регистрация: 01.05.2010
Сообщений: 1,681
28.08.2018, 17:02 10
Максимум аварийным завершением скрипта))

По своему опыту - писал бесконечные скрипты. Из проблем были:
1. Утечка памяти, когда старые объекты не использовались а только накапливались, в итоге скрипт крашился от нехватки оперативной памяти. Лечится тотальным контролем всех сущностей. Данные обрабатываются небольшим пачками, лишнее удаляется.
2. Следует иметь ввиду что есть таймаут и на соединение с БД, его тоже нужно увеличивать, так как если долго не будет ити обращение к бд, соединение прервется и скрипт крякнет от попытки записи/чтения в бд
3. Иногда скрипт что-то делает, а что не понятно, не ждать же 10 часов до завершения?)) Пишите периодически в лог файл о том, что происходит в данный момент. Если перестало писать в лог, но скрипт не крякнул, значит что-то идет в нем не так.
0
Para bellum
Эксперт PHP
4187 / 3114 / 1010
Регистрация: 06.01.2011
Сообщений: 9,091
28.08.2018, 17:04 11
coolio, такие длительные процессы запускайте через командную строку, там нет ограничений, если сами не ограничите.
0
coolio
0 / 0 / 1
Регистрация: 23.09.2016
Сообщений: 47
28.08.2018, 20:02  [ТС] 12
Зверушь, супер, всё развёрнуто и понятно!) спасибо!))

Добавлено через 55 секунд
Para bellum, о, еще идея! спасибо! буду пробовать

Добавлено через 2 часа 54 минуты
насчет cron - таймаут не наблюдается, всё в порядке
0
coolio
0 / 0 / 1
Регистрация: 23.09.2016
Сообщений: 47
17.09.2018, 09:20  [ТС] 13
а можно ли сделать эту рекурсию через определенные промежутки времени?

Добавлено через 3 минуты
допустим, чтобы вызывала сама себя, через каждые 300 секунд?
0
17.09.2018, 09:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2018, 09:20

рекурсивные функции
Здравствуйте, помогите, пожалуйста с написанием рекурсивных функций. Требуется создать...

Рекурсивные функции
Написать рекурсивную функцию для вычисления максимального элемента массива из n элементов, цикл не...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru