Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Задача
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Sergmix Sergmix вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.09.2014
По умолчанию Задача - 21.09.2014, 11:43

Помогите пожалуйста решить следующую задачу:
everyNth(N, List1, List2) копирует первый и, затем, каждый n-ный элемент списка List1 в List2.
Пример: [1,2,3,4,5,6,7,8,9,10] -> [1,3,6,9].
Нельзя использовать ничего кроме: everyNth и встроенных append и length.

Вот промежуточное решение:

everyNth(N, List1, List2) :- X is N - 1, length(A,X), append(A, [Head | Tail], List1), (everyNth(N, Tail, Rest),
List2 = [Head | Rest]; List2 = [Head | []]).

Работает, но не копирует первый элемент.
Ответить с цитированием
  (#2 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 218
Сказал(а) спасибо: 0
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 21.09.2014, 15:46

Что значит каждый n-й элемент, позиция элемента кратная n?
И, собственно, append и length обязательны? Это к тому, что они тут не нужны, в принципе.
Ответить с цитированием
  (#3 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 218
Сказал(а) спасибо: 0
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 21.09.2014, 16:23

prolog Код:
everyNth(N, [Head|Teil], [Head|Rest]) :-
    N > 0,
    N1 is N - 1,
    everyNth(N1, N, Teil, Rest),
    !.

everyNth(0, N, List1, List2) :-
    everyNth(N, N, List1, List2).
everyNth(1, N, [Head|Teil], [Head|Rest]) :-
    everyNth(N, N, Teil, Rest).
everyNth(N0, N, [_|Teil], Rest) :-
    N1 is N0 - 1,
    everyNth(N1, N, Teil, Rest).
everyNth(_, _, [], []).
?- everyNth(3, [1,2,3,4,5,6,7,8,9,10], List2).
List2 = [1, 3, 6, 9].
Ответить с цитированием
Пользователь сказал cпасибо:
Sergmix (21.09.2014)
  (#4 (permalink)) Старый
Sergmix Sergmix вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.09.2014
По умолчанию 21.09.2014, 22:39

Проблема в том, что можно использовать только everyNth с тремя параметрами. Дополнительные predicates (кроме append & length) запрещены.
Ответить с цитированием
  (#5 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 22.09.2014, 13:11

prolog Код:
everyNth(N, [H | T], [H]) :-
        length([H | T], K),
        K < N.
    everyNth(N, List1, [H | List2]):-
        append([H | T], L2, List1),
        length([H | T], N),
        everyNth(N, L2, List2).
    everyNth(_, [], []).
    everyNth(0, _, []).
Ответить с цитированием
Пользователь сказал cпасибо:
Sergmix (23.09.2014)
Ads.
  (#6 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 218
Сказал(а) спасибо: 0
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 22.09.2014, 14:33

......
Ответить с цитированием
  (#7 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 218
Сказал(а) спасибо: 0
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 22.09.2014, 14:37

Цитата:
Сообщение от Alison Посмотреть сообщение
prolog Код:
everyNth(N, [H | T], [H]) :-
        length([H | T], K),
        K < N.
    everyNth(N, List1, [H | List2]):-
        append([H | T], L2, List1),
        length([H | T], N),
        everyNth(N, L2, List2).
    everyNth(_, [], []).
    everyNth(0, _, []).
prolog Код:
?- everyNth(3,[1,2,3,4,5,6,7,8,9,10],[1,3,6,9]).
false.
Ответить с цитированием
  (#8 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 22.09.2014, 14:39

На мой взгляд, и должно быть false. Результат должен быть, по описанию самого задания, [1, 4, 7, 10].
Ответить с цитированием
  (#9 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 218
Сказал(а) спасибо: 0
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 22.09.2014, 14:44

Я об этом сразу и спросил, но было сказано: "Пример: [1,2,3,4,5,6,7,8,9,10] -> [1,3,6,9]."
Ответить с цитированием
  (#10 (permalink)) Старый
arlat arlat вне форума
Member
 
Аватар для arlat
 
Сообщений: 218
Сказал(а) спасибо: 0
Поблагодарили 16 раз(а) в 15 сообщениях
Регистрация: 18.12.2009
Адрес: Минск
По умолчанию 22.09.2014, 16:50

А вообще-то, согласен, с чего учебный пример так заворачивать...
everyNth(3,[1,2,3,4,5,6,7,8,9,10],[1,4,7,10]) всё понятней и графически наглядней.
Ответить с цитированием
  (#11 (permalink)) Старый
Sergmix Sergmix вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.09.2014
По умолчанию 23.09.2014, 07:02

Arlat, опечатался я. [1, 4, 7, 10] должно быть, конечно же.
Ответить с цитированием
  (#12 (permalink)) Старый
Sergmix Sergmix вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.09.2014
По умолчанию 23.09.2014, 07:39

Alison, не могли бы вы прокомментировать рекурсивную часть? Что-то не совсем ее понимаю.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Sergmix Sergmix вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 2
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.09.2014
По умолчанию 23.09.2014, 08:19

Я извиняюсь за мультипостинг, сообщения не редактируются.
Вот эта часть тоже не совсем понятна:

everyNth(N, [H | T], [H]) :-
length([H | T], K),
K < N.
Вроде бы это должно означать: "Если длина List1 меньше чем N, копировать только первый элемент", но почему-то everyNth(3, [1,2], X) выдает false.
Ответить с цитированием
  (#14 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 23.09.2014, 09:37

У меня выдает [1].

Из List1 отделяются первые N элементов, из них в List2 передается первый. Дальше - рекурсия для оставшегося списка.
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на VB haVVVok Visual Basic 0 03.12.2012 10:58
Задача ExTReM13 Задания за деньги 2 07.10.2012 18:06
задача по С++ nemesises Вопросы начинающих программистов 0 01.11.2011 16:21
С++. Задача licenok1_07 Вопросы начинающих программистов 7 19.10.2011 19:32
Помогите, задача по прологу, срочно...задача с высказываниями 4ixOn Prolog 6 10.07.2011 23:29
Помогите, задача по прологу, срочно...задача о станках 4ixOn Prolog 3 09.07.2011 22:48
Задача по MPI 45$ Naikon1988 Задания за деньги 2 22.12.2010 18:12
Задача bumercs Delphi 3 30.09.2010 02:00
Д/Р Задача на C++ Tanzilit Задания за деньги 3 05.01.2009 15:07
Задача Yunno Pascal 4 11.10.2008 19:11
Задача ,,,&#39;..&#39;,,, Prolog 7 29.04.2008 18:09
задача про БД.... imported_ben Prolog 2 18.07.2007 15:37



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