Возьмите подмножества чисел и проверьте, составляют ли они целевую сумму в схеме?

#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))
 

Получение желаемого порядка оставлено в качестве упражнения для читателя (тем более, что вы не говорите, каковы правила упорядочения).