首页 > 解决方案 > 尝试编写一个函数,以球拍语言返回列表中的每三个元素

问题描述

尝试编写一个函数,该函数返回列表中的每三个元素,包括球拍中的第一个元素。我现在得到的只是我的代码第一个爆炸:
预期违反合同:(和/c列表?(不是/c为空?))给定:4

(define l (list 1 2 3 4 5 6 7 8 9))

(define (skipper lst)
   (if (null? lst)
       '() 
       (cons (first lst) 
             (skipper (car (cdr (cdr (cdr lst))))))))
(skipper l)

标签: racket

解决方案


(cdr (cdr (cdr lst)))问题是当lst元素少于 3 个时不能调用。

你用球拍标记了这个,所以我将向你展示一个使用的解决方案match

(define (skipper l)
  (match l

    ;; some element and at least 3 more
    ((list a rest ..3)
     (cons a (skipper (cddr rest))))

    ;; at least one element
    ((cons a _)
     (list a))

    ;; otherwise
    (else
     empty)))

(skipper '())
;; '()

(skipper '(0))
;; '(0)

(skipper '(0 1 2 3 4 5 6 7))
;; '(0 3 6)

(skipper '(0 1 2 3 4 5 6 7 8 9))
;; '(0 3 6 9)

此解决方案不使用lengthwhich 不必要地计算列表的长度


推荐阅读