IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Повернуть список
сообщение
Сообщение #1


Студент 3-к группы (ИГТК)
*

Группа: Пользователи
Сообщений: 32
Пол: Мужской
Реальное имя: Артём

Репутация: -  1  +


Народ подскажите процедуру поворота списка, а то я скоро уже с ума сойду.

Например вводим с клавиатуры (признаком окончания ввода является цифра 0): 1 2 3 4 5 ... 0

Нужно получить: 0 ... 5 4 3 2 1

Заранее благодарен!


--------------------
Жизнь - это лестница. Когда одна ступень проваливается, 2-ая нога находиться на второй ступеньке, а значит есть и второй шанс... ©
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






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

Вот тебе простейший пример, чтоб было понятно, как это работает...

Допустим, исходный список = <1, 2>
Вызываем Reverse(<1, 2>), P указывает на (1).
Проверяем условие: параметр - нулевой указатель? Нет, вызываем Reverse(<2>), P указывает на 2...

Опять проверка условия - и опять P - не nil, вызываем Reverse(<>), P - нулевой указатель, потому как 2 - это последний элемент списка.

Вот теперь после проверки условия (оно не выполнено) - выходим из рекурсии по Exit... Но вышли-то мы только из последнего рекурсивного вызова, а в стеке висят еще два предыдущих уровня рекурсии... После выхода из последнего уровня возвращаемся в тот уровень (причем возвращаемся уже в точку ПОСЛЕ проверки условия, именно на строку с Vkln), где P указывал на 2... Кстати, почему указывал? Он же и сейчас все еще указывает, добавляем эту двойку в новый список. Он теперь равен <2>... Выполнили этот уровень - выходим еще на один выше: тот, с которого начали, но ведь там P указывает на единицу... Добавили единицу - <2, 1>... А вот теперь окончательно выходим из рекурсии и возвращаемся в вызывающую программу...

Что получилось в результате? Был список <1, 2> стал - <2, 1>... Перевернули, правда?

Я понимаю, что если ты никогда не имел дела с рекурсией, то выглядит то, что я написал сейчас просто устрашающе... Нужно пройтись по процедуре Reverse в пошаговом режиме, и посмотреть на окна Call Stack и Watches - тогда поймешь, что там творится...

Как пользоваться отладчиком - можешь посмотреть здесь: Отладка программ , я там написал самое основное...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 5.05.2024 22:33
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name