Это домашнее задание?
Если нет, то это проблема динамического программирования. Чтобы увидеть это, вы должны преобразовать свою проблему в следующую, используя ваш пример в качестве основы. Вы в начале. Вы можете выбрать один из {1,2,3,4}. Оттуда вы можете перейти к {1,2,3,4}. Сделайте это 4 раза, и у вас будет все расположение длины 4 списка {1,2,3,4}.
Теперь вам нужна функция стоимости, которая определяется как:
f(prev, next) = prev ^ next
= 0 if the solution is not valid for your original problem
= 0 if prev is the start
Общая стоимость выражена как
cost(i|a|X) = min(i in {1,2,3,4}, f(i, a) + cost(X))
обратите внимание, что i|a|X
представляет список, начинающийся с элемента a, а затем i, а остальная часть списка - X.
Глядя на функцию cost
, вы должны распознать динамическое программирование.
Оттуда вы можете получить алгоритм. Посмотрите в википедии введение в динамическое программирование .
Реализация моей схемы, которую вы можете протестировать с помощью схемы PLT:
(define (cost lst f)
(if (null? lst)
0
(let ((h (car lst))
(t (cdr lst)))
(if (null? t)
0
(+ (f h (car t))
(cost t f))))))
(define (solve lst f)
(let loop ((s '()))
(if (= (length s) (length lst))
s
(loop
(let choose ((candidate lst)
(optimal #f)
(optimal-cost #f))
(if (null? candidate)
optimal
(let ((c (car candidate)))
(if (memq c s)
(choose (cdr candidate) optimal optimal-cost)
(if (not optimal)
(choose (cdr candidate) (cons c s) (cost (cons c s) f))
(if (<= (cost (cons c s) f)
(cost optimal f))
(choose (cdr candidate) (cons c s) (cost (cons c s) f))
(choose (cdr candidate) optimal optimal-cost)))))))))))
Тогда вызов (solve '(1 2 3 4) expt)
дает другое минимальное решение '(3 2 1 4).