Заменить K элементов, начиная с N-ой позиции

      Комментарии к записи Заменить K элементов, начиная с N-ой позиции отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Заменить K элементов, начиная с N-ой позиции

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

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

    Решим задачу на Turbo Prolog / Visual Prolog 5.2:

    Заменить K элементов списка, начиная с N-ой позиции, на заданную константу.

    domains 
    	list = integer*
    predicates
      	change_sublist_to_const(list, integer, integer, integer, list)
    clauses
    	change_sublist_to_const(List, 0, 0, _Val, List):-!.
    	change_sublist_to_const([_Head|Tail], 0, M, Val, [Val|ChangedTail]):-
    		NextM = M - 1, !,
    		change_sublist_to_const(Tail, 0, NextM, Val, ChangedTail).
    	change_sublist_to_const([Head|Tail], N, M, Val, [Head|ChangedTail]):-
    		NextN = N - 1,
    		change_sublist_to_const(Tail, NextN, M, Val, ChangedTail).
      		
    goal
      	change_sublist_to_const([1,2,3,4,5,6,7,8,9], 2, 4, -1, X).

    Функция принимает список, позицию с которой надо начинать замену, количество заменяемых символов, значение константы и возвращает измененный список.

    change_sublist_to_const

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

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

    Когда все элементы заменены — функция возвращает в качестве результата весь оставшийся исходный список.

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