如何计算一个列表中模式出现在Scheme的另一列表中的次数

时间:2019-02-19 03:51:21

标签: scheme racket mit-scheme

我在Scheme计划中停留了大约5个小时。我正在处理的程序应将两个列表作为输入,然后计算第一个列表中的模式出现在第二个列表中的次数。

例如:> (patt '(b c) '(a b c d e b c)) ==>答案= 2

  

(patt'(a b c)'(a b c a b c d e a b c c c))==>答案= 3

     

(patt'(((a b)c)'(a b(a b)c d e b c))==>答案= 1

下面是我到目前为止所拥有的代码。

(define (patt lis1 lis2)
  (cond
    ((null? lis1) 0)
    ((null? lis2) 0)
    [(and (> (length lis1) 1) (eq? (car lis1) (car lis2))) (patt (cdr lis1) (cdr lis2))]
    ((eq? (car lis1) (car lis2)) (+ 1 (patt lis1 (cdr lis2))))
    (else (patt lis1 (cdr lis2)))
    ))

有人可以帮我解决这个问题吗?谢谢!

4 个答案:

答案 0 :(得分:3)

考虑一个子列表是否以另一个列表开头的测试子问题。

然后对列表的每个后缀执行此操作。总结比赛次数。

如果希望出现不重叠的内容,则可以使前缀匹配,并返回列表的后缀,以便跳过匹配的部分。

也将equals?用于结构相等,而不是eq?用于标识。

答案 1 :(得分:3)

您需要将问题分为几部分:

(define (prefix? needle haystack)
  ...)

(prefix? '() '(a b c))        ; ==> #t
(prefix? '(a) '(a b c))       ; ==> #t
(prefix? '(a b c) '(a b c))   ; ==> #t
(prefix? '(a b c d) '(a b c)) ; ==> #f
(prefix? '(b) '(a b c))       ; ==> #t

(define (count-occurences needle haystack)
  ...)

因此,您可以想象搜索模式(count-occurences '(a a) '(a a a a))。当从第一个元素中找到它时,您需要在下一个元素上再次搜索。因此,由于匹配重叠,因此3的结果为(a a a a)。除子列表为空列表外,每个子列表都涉及使用prefix?

祝你好运!

答案 2 :(得分:1)

(define (patt list1 list2)
  (let ([patt_length (length list1)])
    (let loop ([loop_list list2]
               [sum 0])
      (if (>= (length loop_list) patt_length)
          (if (equal? list1 (take loop_list patt_length))
              (loop (cdr loop_list) (add1 sum))
              (loop (cdr loop_list) sum))
          sum))))

答案 3 :(得分:0)

给这个作业问题一些时间进行腌制之后,我看不出发布其他答案的危害。-

(define (count pat xs)
  (cond ((empty? xs)
         0)
        ((match pat xs)
         (+ 1 (count pat (cdr xs))))
        (else
         (count pat (cdr xs)))))

(define (match pat xs)
  (cond ((empty? pat)
         #t)
        ((empty? xs)
         #f)
        ((and (list? pat)
              (list? xs))
         (and (match (car pat) (car xs))
              (match (cdr pat) (cdr xs))))
        (else
         (eq? pat xs))))

(count '(a b c) '(a b c a b c d e a b c c c)) ;; 3

(count '((a b) c) '(a b (a b) c d e b c)) ;; 1

(count '(a a) '(a a a a)) ;; 3