2013-12-04 2 views
1

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

Это мой код:

(define (subset_length_n n lst) 
    (cond 
    [(empty? lst) empty] 
    [else (foldr (lambda (x y) (if (equal? (length y) n) (cons y x) x)) empty (powerset lst))] 

))

где (Powerset LST) дает список всех подмножеств. Я не понимаю цель складного? Я думал, что программа будет проходить через каждый элемент списка подмножеств, сравнить длину с n, пропустить ее в пустой список, если там же, игнорировать ее, если это не так.

Но (subset_length_n 2 (список 1 2 3)) дает мне (список (список 1 2) 1 2 3), когда я хочу (список (список 1 2) (список 1 3) (список 2 3))

заранее спасибо

ответ

3

При использовании foldr вы не должны проверить, если список ввода пуста, foldr заботится о том, что для вас. И это похоже на работу лучше всего подходит для filter:

(define (subset_length_n n lst) 
    (filter (lambda (e) (= (length e) n)) 
     (powerset lst))) 

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

(define (subset_length_n n lst) 
    (foldr (lambda (e acc) 
      (if (= (length e) n) 
       (cons e acc) 
       acc)) 
     empty 
     (powerset lst))) 

Во всяком случае, он работает, как ожидалось:

(subset_length_n 4 '(1 2 3 4 5)) 
=> '((1 2 3 4) (1 2 3 5) (1 2 4 5) (1 3 4 5) (2 3 4 5)) 
+0

о теперь я вижу, спасибо :) – user3044487

Смежные вопросы