|
14 / 14 / 1
Регистрация: 03.09.2009
Сообщений: 109
|
|
Рекурсия VS Цикл10.11.2009, 13:34. Показов 8655. Ответов 10
Метки нет (Все метки)
Пытаюсь для себя усвоить область рационального применения рекурсии. Требуется помощь.
Давайте рассмотрим на примере некого ряда с рекурсивным соотвношением последующего к предыдущему, ну например есть некий a1=2; ai = 1.325 *ai-1 + 2;(i=2...n) Задача, допустим найти сумму членов ряда для заданного n. Можно посчитать по рекурсивному методу, можно по циклу. Из преимуществ рекурсиии, мне в голову приходит только точность расчета, если речь не идет о целых числах (насколько я понимаю, погрешность округления меньше) Из недостатков: рекурсия требует намного больше памяти, большее число операций. Помогите разобраться в тонкостях применения рекурсии. Где и в каких случаях рационально применять. Каковы преимущества.
0
|
|
| 10.11.2009, 13:34 | |
|
Ответы с готовыми решениями:
10
Цикл + рекурсия Рекурсия через цикл Цикл в цикле или рекурсия |
|
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
|
|
| 10.11.2009, 13:46 | |
|
Я вижу преимущество рекурсии в том, что некоторые алгоритмы проще реализуются. Например, алгоритмы сортировки.
1
|
|
|
149 / 50 / 3
Регистрация: 21.12.2008
Сообщений: 960
|
|
| 10.11.2009, 13:54 | |
|
Итерация - от человека
Рекурсия - от бога
1
|
|
|
1 / 1 / 0
Регистрация: 10.11.2009
Сообщений: 4
|
|
| 10.11.2009, 14:35 | |
|
"точность расчета"
Причем тут точность рассчета?А по теме -- любые фибоначчи-подобные последовательности более предпочтительно вычислять с помощью цикла, более сложные алгоритмы (например, динамика по подотрезкам) легче реализовывать рекурсией, т.к. многие из них предполагают нестандартный обход порой многомерного массива. Во многих задачах можно использовать рекурсивный метод "ленивая динамика", когда для каждого значения функции f(x,y) будет соответствующая ячейка в массиве res[x,y] (или для f(x) -- res[x]), что минимизирует время выполнения за счет использования уже подсчитанных значений. Например, решение вашей задачи считается приемлемым с рекурсией только если используется ленивая динамика: в начале программы - a[1]:=1; все остальные a[i] -- -1; затем, вызов функции f(n); функция f(i) - integer { если a[i]=-1 то { a[i]=1.325*f(i-1)+2;} f=a[i];} соответственно, после выполнения программы все a от 1 до n будут забиты соответствующими им значениями. однако, гораздо лучше просто for i=2 to n a[i]=1.325*a[i-1]+2;
0
|
|
|
14 / 14 / 1
Регистрация: 03.09.2009
Сообщений: 109
|
||
| 10.11.2009, 15:58 [ТС] | ||
|
Если цикл, то после каждой итеррации получившееся число размещается в переменную (т.к. кол-во знаков переменной фиксировано,то соответсвенено появляется погрешность, связанная с округлением), и так по числу итеррациий, как я думал растет погрешность. В случае с рекурсией логика та же, но там , как я думал, значение в переменную размещается только 1 раз. Возможно, все это чушь, просвятите как это происходит...
0
|
||
|
1 / 1 / 0
Регистрация: 10.11.2009
Сообщений: 4
|
|
| 10.11.2009, 17:39 | |
|
результат каждой функции хранится как отдельная переменная (а иначе как вы представляете себе работу рекурсивных функций?).
в некоторых средах есть даже окошко со списком вроде стека функций, где каждый элемент списка представляет собой запись "Название_функции(Аргументы):результ ат" таким образом, если f(x) = f(y) + f(z), то при подсчете f(x) в памяти хранятся уже три переменные: f(y), f(z) и сам (еще не подсчитанный) f(x).
1
|
|
|
3189 / 869 / 39
Регистрация: 29.12.2008
Сообщений: 951
|
|
| 10.11.2009, 18:07 | |
|
Итерация обладает рядом преимуществ: она требует меньше памяти (которое при рекурсии занимает распухающий стек) + меньше машинного времени (опять же рекурсия тратит его на управление стеком). Вообще, программируя рекурсивную программу нужно много чего предусматривать, всякие переполнения и т.д и т.п. На мой взгляд, учитывать это несколько труднее для программиста, нежели имея дело с итерацией.
Уже это обстоятельство (ресурсоемкость) позволяет программисту сделать выбор в пользу итерации, однако, не всё так просто... Дело в том, что некоторые алгоритмы построить с помощью итерации очень трудно, в то время как с помощью рекурсии - просто и прозрачно. Кроме того, рекурсия более наглядна и не требует объявления дополнительных переменных цикла. Лично я, когда программирую, где это возможно использую итерацию. И лишь там, где её использование затруднено - рекурсию. Хотя, признаться, очень люблю рекурсию, если красиво её ввернуть в программе, то она действительно "от Бога".
1
|
|
|
14 / 14 / 1
Регистрация: 03.09.2009
Сообщений: 109
|
|
| 10.11.2009, 18:28 [ТС] | |
|
Phantom, Да, действительно Оочень уж красива рекурсия, мне она тоже очень нравится.
Поэтому, я и задумался над оправданностью ее применения
0
|
|
|
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
|
|
| 11.11.2009, 12:52 | |
|
Chipnddail, такие вычисления, как в вашем примере,на мой взгляд, проще и быстрее делать в цикле. А рекурсию надо использовать там, где она действительно нужна, например, при обходе деревьев и т.д.
0
|
|
|
|
||
| 11.11.2009, 14:11 | ||
|
1
|
||
|
149 / 50 / 3
Регистрация: 21.12.2008
Сообщений: 960
|
|
| 11.11.2009, 14:15 | |
|
почти по теме
я долго ломал руки и ноги с бинарным деревом, но как ток взял рекурсию всё как поносом снесло=)
0
|
|
| 11.11.2009, 14:15 | |
|
Помогаю со студенческими работами здесь
11
Цикл vs рекурсия: достоинства и недостатки
Рекурсия, Arraylist добавляется значение, цикл foreach что быстрее работает рекурсия или цикл Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|