Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу K последних элементов списка.
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Не1еn
Guest
 
Сообщений: n/a
По умолчанию 13.06.2007, 01:27

Вот программка, которая удаляет K первых элементов,
а как переделать чтоб K последних возвращались...

Код:
domains
il=integer*
i=integer
predicates
extract(il,i,il)

clauses
extract([],_,[]).
extract([_|L],K,R):-
K=1,R=L;A=K-1,extract(L,A,R).

goal
extract([1,2,3,4,5,6,7],3,L),write(L),nl.

PS: 25 задач про списки смотрела и "10 упражнений по спискам" тоже (там нет, а жаль!)
Ответить с цитированием
  (#2 (permalink)) Старый
Tinefol Tinefol вне форума
Member
 
Сообщений: 113
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.11.2005
По умолчанию 13.06.2007, 03:07

Ну если смотрели, то там наверняка была задача на возврат списка в обратном порядке. Так вот, переворачиваете и берете К первых элементов

А если серьезно, то можно вот так:

Код:
domains
il=integer*
i=integer

predicates
extract(il,i,il)
extract(il,i,i,il)

clauses
extract(List, Number, List2):-
    extract(List,Number,_,List2).

extract([], _, 0, []).
extract([Head|Tail], Number, NewTempNumber, [Head | Tail2]):-
    extract(Tail, Number, TempNumber, Tail2),
    TempNumber < Number,
    NewTempNumber = TempNumber + 1.
extract([_|Tail], Number, TempNumber, Tail2):-
    extract(Tail, Number, TempNumber, Tail2),
    TempNumber >= Number.

goal
extract([1,2,3,4,5,6,7],3,L),write(L),nl.
Ответить с цитированием
  (#3 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,779
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 13.06.2007, 09:30

Tinefol, очень красиво и декларативно. Прекрасный способ!

Но очень неэффективно (если даже отсечение добавить).
Скучно, процедурно, но эффективно можно сделать так:
Код:
domains
il=integer*
predicates
extract(il,integer,il)
length(il,integer)
length(il,integer,integer)
deletePrefix(il,integer,il)
clauses
extract(List,Number,List1):-
    length(List,0,Length),
    Length>=Number,
    Diff=Length-Number,
    deletePrefix(List,Diff,List1).

length(List,Length):- length(List,0,Length).

length([_|List],C,N):- C1=C+1,length(List,C1,N).
length([],N,N).

deletePrefix(List,0,List):- !.
deletePrefix([_|List],K,List1):- 
    K1=K-1,
    deletePrefix(List,K1,List1). 
goal
extract([1,2,3,4,5,6,7],3,L),write(L),nl.
Ответить с цитированием
  (#4 (permalink)) Старый
Tinefol Tinefol вне форума
Member
 
Сообщений: 113
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.11.2005
По умолчанию 13.06.2007, 11:27

Каюсь каюсь, вариант с длиной - первое о чем я подумал. Но почему-то решил, что так будет проще. Отсечение добавил, спасибо.
Ответить с цитированием
  (#5 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,779
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 13.06.2007, 11:28

Вше первое предложение так же эффективно:
Код:
domains
il=integer*
predicates
extract(il,integer,il)
reverse(il,il)
reverse(il,il,il)
extract1(il,integer,il)
extract1(il,integer,il,il)
clauses
extract(List,Number,List2):-
    reverse(List,List1),
    extract1(List1,Number,List2).

reverse(List,List1):- reverse(List,[],List1).

reverse([A|List],S,List1):- reverse(List,[A|S],List1).
reverse([],List,List).

extract1(List,Number,List1):- extract1(List,Number,[],List1).

extract1(_,0,List,List):- !.
extract1([A|List],Number,S,List1):-
    Number1=Number-1,
    extract1(List,Number1,[A|S],List1).
goal
extract([1,2,3,4,5,6,7],3,L),write(L),nl.
P.S. И чего каяться? Красота главнее.
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление N последних элементов списка Sne*ana Prolog 13 18.10.2017 01:31
Удаление элементов списка, согласно номерам второго списка SWI-Prolog 5.8.2 imported__ro Prolog 11 13.01.2011 02:01
Функция для нахождения суммы последних элементов списка на С++ sveta0391 Вопросы начинающих программистов 0 14.12.2010 22:31
Написать программу преобразования списка которая реверсирует n элементов списка Ma3day Prolog 4 14.11.2010 14:07
Удаление элементов из списка Kate&amp;Lena Prolog 9 11.05.2009 20:57
Удаление N последних элементов kotenok Prolog 14 26.04.2009 00:21
Сложение двух последних чисел списка klif_leopard Lisp 2 13.04.2009 00:02
Удаление N последних элементов из списка umintsov Lisp 6 26.11.2008 12:02
Удаление последних элементов Sne*ana Prolog 7 12.11.2008 20:00
Удаление первых и последних элементов списка. prihod Prolog 17 04.06.2007 16:13
Удаление I*N элементов из списка Kate_Explorer Prolog 7 17.01.2006 20:06
Удаление двух последних элементов в списке FMN Prolog 2 12.12.2005 12:51



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов