如何计算Scheme

时间:2018-11-02 17:40:01

标签: scheme find-occurrences

我试图计算另一个列表的出现次数,但是我被困住了。我不知道是否有任何函数可以执行此操作,但这是我的代码。它实际上找到了第一次出现并返回1。如何继续计数?

    (define *test* '(a b c a b a b a b c  b c b c a b c))

    (define match
      (lambda (pattern text) (cond ((null? pattern) 1)
                                   ((null? text) 0)
                                   ((eq? (car text) (car pattern)) 
                                      (match (cdr pattern) (cdr text)))
                                   (else (match pattern (cdr text))))
    ))

1 个答案:

答案 0 :(得分:0)

您的代码检查列表中的位置,直到找到匹配项为止;如果找到匹配项,则返回找到匹配项。您想检查列表中的每个位置并添加包含模式的位置,但是由于您的代码会先查找模式,因此很难控制它在列表的哪个部分上运行。我无法在您的代码中“解决”该问题,因此我决定从头开始编写一些东西。希望这是有道理的:

(define begins-with (lambda (starter-list full-list)
  (cond ((null? starter-list) #t)
        ((eq? (car starter-list) (car full-list)) (begins-with (cdr starter-list) (cdr full-list)))
        (else #f)
  )))

(define count-matches
  (lambda (pattern lst)
    (cond ((null? lst) 0)
          ((begins-with pattern lst) (+ 1 (count-matches pattern (cdr lst))))
          (else (count-matches pattern (cdr lst)))

第一个函数begins-with不会检查模式的整个字符串,而只是检查它是否“从”模式开始。这样,我们就可以使用另一个功能count-matches来计算以模式开头的后缀的数量,换句话说,就是模式出现在字符串中的次数。

请注意,我在上面编写的代码将计算重叠的序列,例如'(a b a)'(a b a b a)中出现两次。