Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реверсирование списка,состоящего из строк или помо, зеркальное отображение строкового списка 
:(
    Опции темы
lais
  Дата 15.4.2011, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.2.2011

Репутация: нет
Всего: нет



Здравствуйте дорогие форумчане и уважаемые администраторы и модераторы форума, помогите Пожалуйста справиться с задачей!!!

Задание выглядит так

Для заданного списка строк, построить новый список, элементы которого расположены в зеркальном отражении относительно исходного списка, например для списка [a, b, c, d] нужно получить [d, c, b, a]

Эту задачу я нашла на одном из 2-х форумов (я не помню какой но один из них был этот форум, я извиняюсь за забывчивость  smile ,но если задача была опубликована на данном форуме, то киньте Пожалуйста ссылку с данной задачей (у меня недавно винта слетела- поэтому страницы с данной задачей нету,а скопировала я только начало программы без её исправлений, которые были на странице) программа была написана  в среде Visual Prolog

она выглядит так

list=string*

reverse(list,list).
append(list,list,list).

append([],L,L).
append([H|T],L2,L3):-
append(T,[H|L2],L3),
reverse([],[]).
reverse(L,L1):-
append(L,[],L1). 
goal 
L1=["1","2","3","a","b","c"],
reverse(L1,L2),
write(L1),nl,write(L2).

Я переделала её под Strawberry Prolog, вроде все работает, только компилятор выдает замечание 

Warning 6: The predicate =(...) is defined in the ADD file. (clause 0)
0 errors, 1 warning.

А результат такой

[1,2,3,a,b,c]
[c,b,a,3,2,1]Yes.

сама программа выглядит так

list=string*

reverse(list,list).
sliyanie(list,list,list).

sliyanie([],L,L).
sliyanie([H|T],L2,L3):-
sliyanie(T,[H|L2],L3),
reverse([],[]).
reverse(L,L1):-
sliyanie(L,[],L1). 
?-L1=["1","2","3","a","b","c"],
reverse(L1,L2),
write(L1),nl,write(L2).

В чем дело я понять так и не могу, для себя объяснила эту задачу так

Строка 3
L1 и L2 - списки, а L3 - их соединение.
Начиная с 4-й строки и до реверсии
1.    Если присоединить пустой список [] к списку L, то получим список L.
sliyanie([],L,L).
sliyanie([H|T],L2,L3):-
sliyanie(T,[H|L2],L3),

5 строка Если присоеденить не пустой список [H|T] к списку L2, то результатом будет список L3, где L3 получаeтся соединением тела списка [H|T] к [H|L2]
С точки зрения процедурной семантики 
первое предложение - терминальное условие, 
второе - рекурсивное с хвостовой рекурсией
Пустой список после обращения - пустой.
reverse([], []).
Обратить список [X|L1] и получить список L2 можно, если обратить список L1 в L3 и в хвост ему добавить X
reverse([X|L1], L2):-reverse(L1, L3), 
append( L3, [X], L2).
reverse([X|L1], L2):-reverse(L1, L3), 
append( L3, [X], L2).

Вот этот алгоритм хвостовой рекурсии вместе с реверсией мне так и не понятен...............Если кто может,объясните Пожалуйста,мне достаточно всего лишь проследить перемещение одного элемента списка и я всё пойму, а как это сделать я не знаю smile 

Заранее спасибо всем!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Prolog | Следующая тема »


 




[ Время генерации скрипта: 0.0371 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.