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

时间:2014-02-06 06:28:01

标签: scheme racket

我正在介绍Scheme课程,并且已经坚持了几个小时的特定问题。要求是编写一个函数,它接受两个原子列表lat1和lat2,并返回lat1中的原子在lat2中出现的总次数。

例如,

             (出现'(d e f)'(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的其他值的等价性,进一步如果他们是加入计数。 如果有人有任何关于如何处理这个问题的提示,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

(define (occurN lat1 lat2)
  (apply + (map (lambda (elt1) 
                  (count elt1 lat2)) 
                lat1)))

认识到需要count,作为生成occurN,的一步,这是分解问题的重要一步。

这是一个尾递归count

(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)))))