我试图计算另一个列表的出现次数,但是我被困住了。我不知道是否有任何函数可以执行此操作,但这是我的代码。它实际上找到了第一次出现并返回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))))
))
答案 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)
中出现两次。