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)])