Scheme 返回一个列表中的原子在另一个列表中出现的次数

Scheme 返回一个列表中的原子在另一个列表中出现的次数,scheme,racket,Scheme,Racket,我正在学习一门“方案介绍”课程,在这个特定的问题上已经坚持了好几个小时。要求编写一个函数,该函数获取两个原子列表,即lat1和lat2,并返回lat1中的原子在lat2中出现的总次数 比如说 (发生"def"(a x b e d g h f e)) 将返回4 到目前为止,我的代码是 (define occurN (lambda (lat1 lat2) (cond ((null? lat1) 0)

我正在学习一门“方案介绍”课程,在这个特定的问题上已经坚持了好几个小时。要求编写一个函数,该函数获取两个原子列表,即lat1和lat2,并返回lat1中的原子在lat2中出现的总次数

比如说 (发生"def"(a x b e d g h f e)) 将返回4

到目前为止,我的代码是

         (define occurN
          (lambda (lat1 lat2)
           (cond 
           ((null? lat1) 0)
           ((null? lat2) 0)
           (else
              (cond
              ((eq? (car lat1) (car lat2)) (add1 (occurN lat1 (cdr lat2))))  
              (else (occurN lat1 (cdr lat2))))))))
这显然适用于遍历lat1的第一个元素,检查lat2的每个元素是否都等于它,如果等于,则在计数中添加1,否则继续下一个元素。我遇到的问题是让代码从lat1的下一个值和lat1的所有后续值开始,同时保留计数并遍历lat2列表,检查与lat1的其他值(第一个值除外)的等价性,如果它们是,则进一步增加计数。
如果有人对我如何处理这个问题有任何提示,我将不胜感激

假设您有
count
,它返回元素在列表中出现的次数:

(define (occurN lat1 lat2)
  (apply + (map (lambda (elt1) 
                  (count elt1 lat2)) 
                lat1)))
认识到
计数的必要性,
是产生
的一个步骤,
是分解问题的一个重要步骤

下面是一个尾部递归计数:

(define (count elt lst) ; predicate is eq?
  (let counting ((lst lst) (n 0))
    (if (null? lst)
        n
        (counting (cdr lst)
                  (if (eq? elt (car lst))
                      (+ n 1)
                      n)))))

提示:首先编写一个函数来计算原子列表中一个原子的出现次数。然后在解决问题的函数中使用该函数。