2017-01-16 2 views
0

Я хочу написать программу, которая получает список в качестве входных данных и список упорядочен return ture, а если список не упорядочен, сортируйте список. я пишу программу, которая получает список как входной и возвращает true, если этот список упорядочен и возвращает false в противном случае (упорядоченный (список)), также я пишу программу, которая получает список и сортирует его, и возвращает упорядоченный список в качестве вывода (bubblesort (List, Ordered)), но я не могу объединить их вместе, чтобы написать программу, которая, если список упорядочен, возвращает true else, сортирует список. я думаю много, но я не могу. пожалуйста, помогите мне спасибо большоеЕсли список упорядочен, возвращайте true else, если список не упорядочен, сортируйте список

+2

не могли бы вы предоставить код и пример вашего ожидаемого результата? Знание того, с чем вы работаете, поможет нам вам помочь. –

+0

BubbleSort - это, в общем, алгоритм, содержащий внешний цикл и внутренний цикл, в котором вы меняете значения внутри внутреннего, внешний контролирует, сколько раз вам нужно перебирать (квадратичный в худшем случае, может остановиться после во время некоторой внутренней итерации не выполнялось никаких свопов). Удалите внешнюю и повторите операцию только после подсчета необходимых свопов. Если его нет, он уже заказывается. (Конечно, вы можете удалить фактический своп и подсчитать только один, чтобы сохранить исходный список немодифицированным). – sascha

+0

Вы также можете оставить голосование в дополнение к принятому голосованию. –

ответ

0

, например, я хочу заказать ([1,2,3]) возвращает истину, как выход и упорядоченные ([1,3,2]) возвращает [1,2,3] как выход

Это невозможно в Прологе. Предикаты Пролога не похожи на процедуры на многих других языках, которые могут привести к разрушительным изменениям в структурах данных. В Prolog, как и во многих функциональных языках, «сортировка списка» означает вычисление нового списка с теми же элементами в (возможно!) Разном порядке.

Итак, если вы хотите предикат, который берет список и может «возвращать» отсортированную версию того же списка, вам нужен предикат с двумя аргументами. Обычным способом Пролога здесь было бы просто использовать предикат sort/2. Он работает хорошо, даже если список «вход» уже отсортирован (но обратите внимание, что он удаляет повторяющиеся элементы).

Если вы действительно хотите, чтобы кодировать логику «проверки упорядоченного списка, если он упорядочен, вернуть его без изменений, в противном случае возвращает отсортированный версию», вы можете сделать это, как это, используя существующий код:

list_sorted(List, SortedList) :- 
    ordered(List), 
    SortedList = List. 
list_sorted(List, SortedList) :- 
    \+ ordered(List), % the list is not already ordered 
    bubblesort(List, SortedList). 

(я не проверял свой код.)

+0

Большое спасибо. ты помог мне . еще раз спасибо. – Sara

+0

Вы можете заменить первое предложение просто: 'list_sorted (List, List): - упорядоченный (List) .' – lurker

Смежные вопросы