Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсия в Прологе 
:(
    Опции темы
blur
Дата 11.4.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Люди, помогите немного с рекурсией.
Есть вот такая задачка: Вводятся n чисел, определить наибольшую разницу между двумя соседними элементами, вывести также номера элементов, между которыми она найдена.

Ввод элементов и их печать я сделал,
Код


predicates
    input(integer,integer)

goal
    write("Input number num:"),
    readint(N),input(N,N).
clauses
    
    input(0,N):-!.
    input(N2,N):-readint(C),
     N1=N2-1, input(N1,N),
    write(C),nl.    


а как затем в цикле определить максимальную разницу между ними, что-то не получается. 
PM MAIL   Вверх
Artemios
Дата 13.4.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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



Цитата(blur @  11.4.2007,  13:46 Найти цитируемый пост)
Вводятся n чисел, определить наибольшую разницу между двумя соседними элементами, вывести также номера элементов, между которыми она найдена.


Так как сравниваются лишь соседние элементы, а также требуется лишь вывод разницы и номеров элементов, то нет необходимости держать в памяти всё вводимое.
Я сделал так (на SWI-Prolog):
Код

max_diff(CurrNum,CurrItem,MaxDiff,NumMaxDiff):-
    NewNum is CurrNum+1,
    write('['),write(NewNum),write('] > '),
    read(NewItem),
    (    integer(NewItem),!,
        Diff is abs(NewItem-CurrItem),
        (    Diff>MaxDiff, max_diff(NewNum,NewItem,Diff,NewNum);
            Diff=<MaxDiff, max_diff(NewNum,NewItem,MaxDiff,NumMaxDiff)
        );
        write('The maximal difference is '), write(MaxDiff),
        Prev is NumMaxDiff-1,
        write('\nbetween items with indexes ['), write(Prev),write('] and ['), write(NumMaxDiff), write(']\n')
    ).

goal:-
    write('[1] > '),
    read(Item),
    integer(Item),!,
    max_diff(1,Item,0,1).


(признаком окончания ввода чисел будем считать ввод любого нечислового атома)
Проверка:
Цитата

?- goal.
[1] > 20.
[2] > 21.
[3] > 23.
[4] > 25.
[5] > 35.
[6] > 33.
[7] > end.
The maximal difference is 10
between items with indexes [4] and [5]

Yes
?-        



Это сообщение отредактировал(а) Artemios - 13.4.2007, 17:15


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума Prolog
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

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

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


 




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


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

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