所以,我已经完成了创建一个程序的任务,该程序为您提供了两个字母和一个列表,需要在该列表中找到。我开始编写程序,但很快偶然发现了一些错误。我的代码如下:
(define (count-2-consecutive x y lst)
(define (iter ctr lst)
(cond ((null? lst) '())
((and (eq? x (car lst)) (eq? y (cadr lst))) (count-2-consecutive x y (cdr lst)))
(else (count-2-consecutive x y (cdr lst)))))
(iter 0 lst))
因此,当我尝试运行示例时(例如:(count-2-consecutive 'n 't '(h o t t e n t o t t e n t e n t e n))
我收到了合同违规错误,指出我在代码中使用的cadr
如果有人能帮助我指出我做错了什么,我会非常感激。
答案 0 :(得分:0)
要使用(cadr xs)
,您需要知道列表xs
至少包含两个元素。您使用测试(null? xs)
来确保列表xs
具有一个元素。使用测试(null? (cdr xs))
在cond中添加一个额外的子句来处理单元素列表。
(define (count-2-consecutive x y lst)
(define (iter ctr lst)
(cond ((null? lst) '())
((null? (cdr lst)) SOMETHING)
((and (eq? x (car lst)) (eq? y (cadr lst))) (count-2-consecutive x y (cdr lst)))
(else (count-2-consecutive x y (cdr lst)))))
(iter 0 lst))
答案 1 :(得分:0)
也可以在这里使用for/sum
循环:
(define (f x y l)
(for/sum ((i (sub1 (length l)))
#:when (and (equal? (list-ref l i) x)
(equal? (list-ref l (add1 i)) y)))
1))
测试:
(f 1 2 '(0 1 2 3 1 2 5))
(f 1 2 '(0 1 3 1 2 5))
(f 1 2 '(0 4 3 5 8))
输出:
2
1
0
还可以使用take
函数对列表进行测试,以获得与x和y进行比较的2个项目的子列表:
(define (f x y l)
(let loop ((l l)
(cntr 0))
(cond
[(< (length l) 2) cntr]
[(equal? (take l 2) (list x y)) (loop (rest l) (add1 cntr))]
[else (loop (rest l) cntr)])))