计算Scheme中列表中的多个连续字母

时间:2016-10-30 12:55:00

标签: 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 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如果有人能帮助我指出我做错了什么,我会非常感激。

2 个答案:

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