我在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)))
))
有人可以帮我解决这个问题吗?谢谢!
答案 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