【问题标题】:Count multiple consecutive letters in a list in Scheme计算Scheme中列表中的多个连续字母
【发布时间】:2017-03-12 18:40:11
【问题描述】:

因此,我的任务是创建一个程序,该程序为您提供两个字母和一个列表,需要在该列表中找到它们。我开始编写程序,但很快就发现了一些错误。我的代码如下:

(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。如果有人可以帮助我指出什么我做错了,非常感谢。

【问题讨论】:

    标签: list recursion scheme iteration racket


    【解决方案1】:

    要使用(cadr xs),您需要知道xs 列表至少有两个元素。您使用测试(null? xs) 来确保列表xs 有一个元素。在您的 cond 中添加一个额外的子句,并使用测试 (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))
    

    【讨论】:

      【解决方案2】:

      这里也可以使用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 函数来测试列表,以获得 2 个项目的子列表以与 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)])))
      

      【讨论】:

        猜你喜欢
        • 2019-05-05
        • 2018-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 2020-02-19
        • 1970-01-01
        相关资源
        最近更新 更多