【问题标题】:Returning number of times atoms in one list appear in another list返回一个列表中的原子出现在另一个列表中的次数
【发布时间】:2014-02-06 06:28:00
【问题描述】:

我正在学习 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 的其他值的等价性,进一步如果它们是,则添加到计数中。 如果有人对我如何解决这个问题有任何提示,将不胜感激。

【问题讨论】:

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

标签: scheme racket


【解决方案1】:

假设您有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)))))

【讨论】:

    猜你喜欢
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多