SWI Prolog: Разбить список на подсписки разной длины

      Комментарии к записи SWI Prolog: Разбить список на подсписки разной длины отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки SWI Prolog: Разбить список на подсписки разной длины

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 1 месяц назад.

  • Автор
    Сообщения
  • #3975

    Zzz
    Участник

    Разбить список на несколько списков, записывая в первый список 1 (2^0) элемент, во второй — 2 (2^1) элементы, в третьей — 4 (2^2) элементы, в четвертый — 8 (2^3) элементов и т.д.

  • #3980

    Для решения вашей задачи нужна функция, которая будет выбирать N первых элементов списка, мы уже писали такую функцию — get_first_n. Но в нашем случае мало извлечь первые N элементов, ведь надо получить хвост (из него мы будем пробовать извлечь N*2 элементов). Тем не менее, реализуется это подобным образом — с помощью length и append.

    Кроме того, если размер последней части окажется меньше нужной нам длины — надо взять весь список (или не брать ничего — у вас про такой случай в условии не сказано).

    Исходный код мог бы выглядеть следующим образом:

    %divide_power_two(+List, -ListOfParts)
    divide_power_two(List, ListOfParts):-
      divide_power_two(List, 1, ListOfParts).
      
    divide_power_two(List, N, [[List]]):-
      length(List, Len), Len =< N, !.
    divide_power_two(List, N, [FirstN|TailParts]):-
      append(FirstN, Tail, List),
      length(FirstN, N), !, 
      NextN is N*2,
      divide_power_two(Tail, NextN, TailParts).

    Вспомогательная функция принимает параметр N (длину текущей выделяемой части списка). При первом вызове N равно единице, на каждой следующей итерации его значение увеличивается в два раза. Процесс останавливается когда в списке останется меньше N элементов (Len =< N).

Для ответа в этой теме необходимо авторизоваться.