Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для БегущийЧеловек
1 / 1 / 1
Регистрация: 02.04.2014
Сообщений: 19

Переход от/к рекурсии

16.04.2014, 00:53. Показов 2226. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Вопрос не совсем по джаве а больше по базовым алгоритмическим вещам которые приходится наверстывать. Допустим есть метод, в котором идет рекурсия. Как переписать его без рекурсии?(слышал, что это делается через стек/очередь, но только слышал). Интересует как бы алгоритм перехода в общем виде что-ли. Буду очень благодарен если кто даст ссылку на книгу/статью с примерами
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.04.2014, 00:53
Ответы с готовыми решениями:

Переход по записям (изменение вида формы кликом - переход на определенную запись)
есть форма ленточная, хочу сделать чтобы при нажатии на инфу открывалась запись на которую нажали в режиме одиночная на конкретную запись

WPF Переход по страницам и переход со страницы на главную форму
У меня есть главная страница (форма), есть еще одна страница. Хочу при нажатии на кнопку в главной форме перейти на другую страницу, это не...

Переход по ссылке или не переход(метод confirm).
Что-бы я тут не делал, он переходит по ссылке ramen.php?buy=(id) в любом случае.А как сделать так чтобы только по нажатию кнопки ok?вот...

4
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
16.04.2014, 07:59
Можно почитать (букав не много)
http://logic.pdmi.ras.ru/~hirs... cture3.pdf
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
16.04.2014, 09:52
БегущийЧеловек, насколько я знаю, в общем виде (если рекурсивных вызовов может быть несколько) алгоритма конвертации не существует.
Основной принцип в использовании стека такой:
- Создаем стек, который в каждом элементе хранит все аргументы функции (метода)
- В начале метода ложим на стек один элемент - те параметры, которые нам передали
- Пишем цикл, который достает из стека параметры, пока стек не пуст
- Вместо рекурсивного вызова, добавляем в стек новый элемент с соответствующими аргументами

Добавлено через 4 минуты
Пример того, что должно получиться:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public static void recursiveToStackExample(int[] arr, int l, int r) {
        class Args {
            int arr[];
            int l;
            int r;
 
            Args(int[] arr, int l, int r) {
                this.arr = arr;
                this.l = l;
                this.r = r;
            }
        }
 
        Deque<Args> stack = new ArrayDeque<>();
        stack.push(new Args(arr, l, r));
        Args next;
        while ((next = stack.pop()) != null) {
            //основной цикл работы, который вместо рекурсивного вызова будет добавлять элементы в stack
        }
    }
Добавлено через 2 минуты
Такой способ не работает, если метод содержит какую-то еще логику после рекурсивного вызова.
Например, вычисления чисел фибонначи таким способом заменить не получится, а вот quicksort скорее всего получится.
1
 Аватар для БегущийЧеловек
1 / 1 / 1
Регистрация: 02.04.2014
Сообщений: 19
18.04.2014, 02:19  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
- Создаем стек, который в каждом элементе хранит все аргументы функции (метода)
Спасибо за ответ. Насколько я понял получается примерно следующая картина: при рекурсии функция вызывается много раз внутри себя, первый раз с аргументом arg1, второй раз с аргументом arg2 и т.д. При уходе от рекурсии мы создаем стек, кладем туда arg1, запускаем цикл(да, пока стек не пуст), в цикле меняется аргумент + логика, добавляем новый аргумент в стек и т.д.
Цитата Сообщение от turbanoff Посмотреть сообщение
в общем виде (если рекурсивных вызовов может быть несколько) алгоритма конвертации не существует.
А так конечно это по большому счету получается искусство
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
20.04.2014, 23:13
БегущийЧеловек, Вы не с той стороны заходите. Есть некоторая задача, и есть два способа её решить. Один - итерационный, другой - рекурсивный. Пытаться переделать один из этих алгоритмов в другой - занятие по сути порочное. Нужно просто решать задачу составляя алгоритм по правилам выбранного вида.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.04.2014, 23:13
Помогаю со студенческими работами здесь

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

Рекурсии
Заданы два числа X(любое) и N(целое). Вычислить sin(sin(sin(…sin(X)…))) N раз, при помощи рекурсии С рекурсиями совсем глухо, не...

Рекурсии
Ребят,программа по задаче 22 из ЕГЭ. При вводе программа зависает. #include &lt;stdio.h&gt; int f(int n,int c) { if(n&lt;1) ...

Рекурсии
Решить задачу в консольном режиме: Написать рекурсивную функцию для вычесления значения так называемой функции Аккермана для...

рекурсии
Помогите пожалуйста как написать рекурсивную программу для нахождения суммы первых членов арифметической прогрессии если известны первый...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru