#scheme #lisp #subset #racket #subset-sum
#схема #lisp #подмножество #ракетка #подмножество-сумма
Вопрос:
Я хочу написать вызываемую функцию sumToN
, которая принимает в качестве входных данных список чисел L
и целевое число T
и возвращает каждое подмножество чисел, которое в L
сумме составляет ровно T
. Эти подмножества должны быть возвращены в определенном порядке (как показано в примерах ниже).
например, ввод ((sumToN 6 '(1 2 3 4 5)))
например, вывод (((2 4) (1 5) (1 2 3)))
у меня это пока
(define sumToN
(lambda (T L)
(cond
[(null? L) '() ]
[(null? (cdr L)) (checkEqual T (list(car L))) ]
[#t (checkEqual T ( (cadr L)(car L)))]
)
)
)
;; creating helper function called checkEqual
(define checkEqual
(lambda (T L)
(cond
[(equal? T (car L)) (L) ]
[#t '()]
)
)
)
Ответ №1:
Racket делает это тривиальным:
(define (sumToN t l)
(sequence->list
(sequence-filter (lambda (combo) (= (apply combo) t))
(in-combinations l))))
(sumToN 6 '(1 2 3 4 5)) ; => ((1 2 3) (2 4) (1 5))
Получение желаемого порядка оставлено в качестве упражнения для читателя (тем более, что вы не говорите, каковы правила упорядочения).