我需要在采用两个列表的方案中编写一个函数,如果一个列表是另一个列表的排列,则返回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)
))
谢谢
答案 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
的形式提供。)