您在置换方案

问题描述 投票:3回答:1

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

谢谢

scheme permutation
1个回答
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。)

© www.soinside.com 2019 - 2024. All rights reserved.