检查方案中的排列

时间:2019-02-12 00:58:19

标签: scheme permutation

我需要在采用两个列表的方案中编写一个函数,如果一个列表是另一个列表的排列,则返回true。
例如
(permutation '(3 4 7) '(7 3 4))将返回#t
(permutation '(3 4 7) '(c 3 4 5))将返回#f

这是我到目前为止获得的代码,但是我被卡住了:

 (define (permutation list1 list2)
  (cond
    ((equal? list1 list2))
    ((not (list? list1)))
    ((memq (car list1) list2) (permutation (cdr list1) list2))
    (else #f)
    ))

谢谢

1 个答案:

答案 0 :(得分:3)

当且仅当

时,您才能进行排列
  • list1中删除list2的元素会生成空列表
  • list2中删除list1的元素会产生一个空列表。

如果您有一个将一个列表中的所有元素从另一个列表中删除的函数(我们称之为“不带”),则可以编写

(define (permutation? xs ys)
  (and (empty? (without xs ys))
       (empty? (without ys xs))))

假设您有一个函数remove-first从列表中删除了元素的第一个实例,则可以使用折叠定义without

(define (without xs ys)
    (foldl (lambda (x ls) (remove-first x ls)) ys xs))

仅剩remove-first

(define (remove-first x xs)
  (cond ((empty? xs) '())
        ((equal? x (first xs)) (rest xs))
        (else (cons (first xs) (remove-first x (rest xs))))))

(在您的方案中,remove-first可能已经以remove的形式提供。)