1

我在方案中得到了两个列表,并检查我们是否可以从另一个的元素中形成其中一个。换句话说,我检查这是否是一个 . 为此,我实现了一个名为 member? 的函数,它接受一个符号和一个列表,如果此符号在列表中,则此函数从列表中删除该符号并返回新列表。该函数的示例输入输出如下所示:

我正在考虑执行以下操作:由于我们有两个要检查的列表,因此我使用第一个列表和该列表中的每个符号,使用 member? 函数,我检查该符号是否出现在另一个列表中。最后,如果它是一个,那么我们有一个空列表。这里有一些试验可以做到这一点:

(define member?
 (lambda (inSym inSeq)
(if (and (symbol? inSym) (sequence? inSeq)) ; can remove?       
   (remove-member inSym inSeq)             ; then remove!       
   'can-not-remove))) ; otherwise, present an error message

(define 
 (lambda (inSeq1 inSeq2)
    (if (and (sequence? inSeq1) (sequence? inSeq2)) ;if both are sequences
        (if(equal? '() (member? (car inSeq1) inSeq2))) ... ???
 )
)

我无法组织这里需要的递归。谁能帮我这个?

谢谢你。

4

3 回答 3

2

仅作记录:检查两个序列是否是字谜的最简单方法是对它们进行排序并查看它们是否相等:

(define symbol<?
  (lambda (s1 s2) ; compare two symbols
    (string<? (symbol->string s1)
              (symbol->string s2))))

(define anagram?
  (lambda (inSeq1 inSeq2)
    (and (sequence? inSeq1) ; a sequence is a list of symbols
         (sequence? inSeq2) ; a sequence is a list of symbols
         (equal? (sort inSeq1 symbol<?) (sort inSeq2 symbol<?)))))
于 2013-04-30T22:04:11.627 回答
2

使用排序效率不高,对于您的实施您不需要成员?功能:

(define remove-member
(lambda (n lst)
(cond ((null? lst)
       '())
      ((equal? (car lst) n)
       (cdr lst))
      (else
       (cons (car lst)
             (remove-member n (cdr lst)))))))



(define anagram?
(lambda (lst1 lst2)
(cond ((and (null? lst1) (null? lst2))
       #t)
((or (null? lst1) (null? lst2))
       #f)
      (else
       (anagram? (cdr lst1) (remove-member (car lst1) lst2))
))))
于 2013-04-30T22:07:57.943 回答
-1
(define canFind?
  (lambda (item sequence)
    (if (null? sequence)
      #f
      (if (equal? item (car sequence))
        #t
        (canFind? item (cdr sequence))
      )
    )
  )
)

(define remove
  (lambda (item sequence)
    (if (equal? item (car sequence))
      (cdr sequence)
      (append (list (car sequence)) (remove item (cdr sequence)))
    )
  )
)

(define isAnagram?
  (lambda (seq1 seq2)
    (if (and (null? seq1) (null? seq2))
      #t
      (if (or (null? seq1) (null? seq2))
        #f
        (if (canFind? (car seq1) seq2)
          (isAnagram? (cdr seq1) (remove (car seq1) seq2))
          #f
        )
      )
    )
  )
)
于 2013-04-30T21:58:29.540 回答