Что нового

Целесообразность использования рекурсии в AutoIt

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
CreatoR:
Я бы не стал так просто направо и налево использовать рекурсию, только при необходимости (очень редко когда может понадобиться).

Почему? Откуда такое предубеждение против рекурсии?
Рекурсия - очень гибкий и мощный инструмент.
Если проблемы с выделением памяти - используйте глобальные переменные вместо передачи параметров.
Не вижу никаких препятствий к использованию рекурсии где появляется такая возможность.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Рекурсия

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Рекурсия" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.










На практике рекурсия действительно не так уж и часто требуется. В основном в заранее известных типовых задачах, например получение дерева папки или ветки реестра. И правильная ее реализация не самая простая задача.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
C2H5OH [?]
Не вижу никаких препятствий к использованию рекурсии где появляется такая возможность.

А я не вижу никаких причин пользоваться рекурсией, там, где можно обойтись без нее.
С точки зрения простоты кодинга, разницы нет никакой - все равно, нужно четко понимать алгоритм работы программы.
Так, что, пользоваться рекурсией, или нет - дело личного удобства.
Используя рекурсию нужно учитывать несколько моментов:
- нужно быть уверенным, что рекурсия не переполнит стек операций
- если, при рекурсии, в функцию, в качестве параметров, передаются большие объемы информации, то получим нехилое замедление скорости выполнения.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
asdf8 сказал(а):
А я не вижу никаких причин пользоваться рекурсией, там, где можно обойтись без нее.

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,483
Yashied [?]
там где нужна рекурсия, без нее никак не обойтись
Я могу ошибаться, но мне кажется что рекурсию можно заменить циклами.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Стараюсь обходиться без рекурсии там, где это возможно. Пока обхожусь. ИМХО, с ней очень аккуратно нужно обращаться.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Я могу ошибаться, но мне кажется что рекурсию можно заменить циклами.

Ошибаешься. Циклами можно заменить, если заранее известен уровень вложенности, да и то не очень большой. Попробуй написать циклами поиск файла на диске.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ну да.

;D

Только эту задачу можно и нужно решать с помощью рекурсии.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,483
Yashied [?]
Только эту задачу можно и нужно решать с помощью рекурсии.
Не уверен, но в любом случае, значит я всё таки не ошибаюсь насчёт замены рекурсии циклами? :whistle:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,483
Рекурсия используется для облегчения задачи, когда требуется построить сложные алгоритмы (поиск файлов на диске совсем не сложный алгоритм).
Однако она занимает больше памяти, отсюда в принципе и времени тоже.
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Как бы...
Я когда думаю насколько ресурсоёмка работа с регулярными выражениями, то... :scratch:
Правильно! Меня это волновать не должно. Меня волнует облегчение труда программиста при использовании тех или иных методов.

А насчет реализации чего-то с помощью циклов - давно известно что любую программу можно написать используя только условный и безусловный переход. Но давайте ж не будем вдаваться в крайности!
:wall_brake:
 

AZJIO

Меценат
Меценат
Сообщения
2,891
Репутация
1,195
Я только в двух алгоритмах встречал рекурсию: поиск файлов и поиск в реестре. Поиск файлов можно сделать без рекурсии, но подсчёт текущего уровня вложения затрачивает вычисление больше чем инициализация вызова функции. Так что этот метод быстрее если лишится параметра проверки уровня вложения.

asdf8
asdf8 сказал(а):
А я не вижу никаких причин пользоваться рекурсией, там, где можно обойтись без нее.
Откуда такая неприязнеь к рекурсии? У AutoIt множество ограниченией и что теперь его не использовать потому что вдруг он их привысит. Вообще не вижу ни какой проблемы. Есть лимит 5100 ркурсивных вызовов, если они не превышены, то это тоже самое что не привысить один из лимитов AutoIt. К примеру у поиска файлов рекурсия не может превысить 123, так как уровень вложения каталогов не превышает этот уровень. Каждый вход во вложенный каталог - рекурсивный вызов, каждое завершение прохода каталога - возврат из рекурсивного вызова. И того входов можно выполнить 123 остальные вызовы будут являтся выходом на предыдущий уровень (5100 - 123 = 4977 - запас шагов рекурсии).

- если, при рекурсии, в функцию, в качестве параметров, передаются большие объемы информации, то получим нехилое замедление скорости выполнения.
Реальные примеры есть? Наполнение переменных в рекурсии держит в памяти количество вызванных функций с примером поиска файлов это опять же не превышает одного списка файлов, потому что каждый вызов содержит только список файлов полученных на этом шаге рекурсии, при выходе из шага рекурсии данный присоединяются к общему списку. То есть операция в цикле будет содержать примерно такое же количество данных.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот отличный пример рекурсии. И посмотрите во что может превратиться код (Ответ #8), если попытаться использовать циклы.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
AZJIO [?]
Реальные примеры есть?
Есть, правда на PureBasic, передача больших объемов информации в качестве параметра замедлило функцию раз в сто. На AutoIt будет тоже самое.

Откуда такая неприязнеь к рекурсии?
Неприязни, как таковой нет, просто стараюсь ей не пользоваться.

У AutoIt множество ограниченией и что теперь его не использовать потому что ...
Переполнение стека операций относится практически ко всем ЯП.

C2H5OH [?]
Но давайте ж не будем вдаваться в крайности!
Для кого-то крайностью будет использование ЯП без ООП - не будем же мы из-за этого холивар разводить.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
asdf8 сказал(а):
...передача больших объемов информации в качестве параметра замедлило функцию раз в сто.

Передача параметров сводится к дополнительному выделению и освобождению памяти при входе и выходе из функции. Скорость этого процесса напрямую зависит от менеджера памяти того или иного ЯП. В AutoIt, да, это может сильно снизить эффективность с ее Variant типами, в других ЯП возможно будет быстрее. Но в любом случае, все зависит от оптимизации кода. Если необходимо передавать большие данные, то нужно передавать только адреса, aka ByRef. Рекурсия, это всего лишь еще одна полезная возможность ЯП, и использовать ее, естественно, нужно там, где это необходимо. Впрочем, как и любые другие возможности...
 

AZJIO

Меценат
Меценат
Сообщения
2,891
Репутация
1,195
asdf8
Переполнение стека операций относится практически ко всем ЯП.
Есть лимит он определён. Как сказано в справке некоторые лимиты чисто условность, то есть вы можете достичь предела по памяти быстрее чем столкнётесь с ограничением. То есть именно количество операций не вызывает проблемы. Другое дело не контролируемая рекурсия, у меня так случилось в программе Zoom (уже исправлено). При вызове дочернего окна происходит вход в функцию, далее уничтожаются ненужные окна и вызывается функция основного окна, из которого вызывается опять дочернее окно. Я даже не заметил как непреднамеренно создал неконтролируемую рекурсию. Хотя я вряд ли привысил бы уровень 5100, но исправил.
Кстати, любой вызов функции из функции является неким аналогом рекурсии, с единственной лишь разницей, что функция не вызывает себя, а всё остальное ничем не отличается. Так что вызвывать функцию из функции наверно теперь нельзя для тех кто избавляется от рекурсии :smile:
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Yashied [?]
Если необходимо передавать большие данные, то нужно передавать только адреса, aka ByRef.
В том то и дело, что это была встроенная функция языка и она не принимала указатели, а только данные.

AZJIO [?]
Так что вызвывать функцию из функции наверно теперь нельзя для тех кто избавляется от рекурсии
Я ж говорил, что не фанатичный противник рекурсии, просто стараюсь, где можно, обходиться без нее.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
OffTopic:
рекурсию всегда можно заменить циклами. для неизвестных уровней вложенности существуют циклы с пост- и пре-проверкой условия.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Kaster сказал(а):
OffTopic:
рекурсию всегда можно заменить циклами. для неизвестных уровней вложенности существуют циклы с пост- и пре-проверкой условия.

OffTopic:
А все операции вычисления в конечном счете сводятся к битовому сравнению.
 
Верх