我做了一个函数,它接受列表和列表的两个元素。如果第二个参数出现在第三个参数之前的list参数中,它应返回#t:
如果任何假定的元素都没有出现,那么该过程也应该返回#f。
这是我到目前为止所得到的:
(define (before-in-list? lst a b )
(cond
((empty? lst ) #f)
((eq? (car lst ) a) ( map b (cdr lst)) #t)
((eq? (car lst ) b) #f)
(else (before-in-list? (cdr lst ) a b ))))
测试它,我使用:
(before-in-list? '(back in the ussr) '(in) '(ussr))
(before-in-list? '(back in the ussr) '(the) '(ussr))
问题是它每次都给我f。
有关如何修复它的任何提示吗?
答案 0 :(得分:1)
您使用map
的方式没有意义。此外,您应该使用equal?
进行更一般的比较,a
和b
参数不应该是列表。试试这个:
(define (before-in-list? lst a b)
(cond
((empty? lst ) #f)
((equal? (car lst) a)
(if (member b (cdr lst)) #t #f))
((equal? (car lst) b) #f)
(else (before-in-list? (cdr lst ) a b))))
(before-in-list? '(back in the ussr) 'in 'ussr)
=> #t
(before-in-list? '(back in the ussr) 'the 'ussr)
=> #t