我在计划中给出了两个列表,并检查我们是否可以从另一个元素中形成其中一个列表。换句话说,我检查这是否是一个。为此,我实现了一个名为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))) ... ???
)
)
我无法组织此处所需的递归。任何人都可以帮我这个吗?
谢谢。
答案 0 :(得分: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<?)))))
答案 1 :(得分:2)
使用sort并不高效,对于您的实现您不需要该成员?功能:
(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))
))))
答案 2 :(得分:-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
)
)
)
)
)