List 在Scheme中对列表中的多个连续字母进行计数
所以,我的任务是创建一个程序,给你两个字母和一个列表,需要在列表中找到。我开始写程序,但很快就发现了一些错误。我的代码如下:List 在Scheme中对列表中的多个连续字母进行计数,list,recursion,scheme,iteration,racket,List,Recursion,Scheme,Iteration,Racket,所以,我的任务是创建一个程序,给你两个字母和一个列表,需要在列表中找到。我开始写程序,但很快就发现了一些错误。我的代码如下: (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
(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-continuous't'(h-to-t-t-t-t-t-t-n-t-t-n-t-n))
会出现一个“违反合同”错误,指向我在代码中使用的cadr
。如果有人能帮我指出我做错了什么,我将非常感激。为了使用(cadr xs)
您需要知道列表xs
至少有两个元素。您可以使用test(null?xs)
来确保列表xs
至少有一个元素。在您的cond中添加一个额外子句,使用test(null?(cdr xs))
来处理一个元素列表
(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))
为了使用(cadr xs)
您需要知道列表xs
至少有两个元素。您可以使用test(null?xs)
来确保列表xs
至少有一个元素。在test(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))
您也可以在此处使用
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进行比较:
(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)])))
(定义(f x y l)
(let循环((l)
(cntr 0)
(续)
[(<(长度l)2)cntr]
[(相等?(取L2)(列表XY))(循环(剩余l)(添加1 cntr))]
[其他(循环(剩余l)cntr)])
也可以在此处使用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进行比较:
(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)])))
(定义(f x y l)
(let循环((l)
(cntr 0)
(续)
[(<(长度l)2)cntr]
[(相等?(取L2)(列表XY))(循环(剩余l)(添加1 cntr))]
[其他(循环(剩余l)cntr)])