我需要接受两个列表,如果一个列表是其他的排列返回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)
))
谢谢
你有排列当且仅当
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
。)