racket - 尝试编写一个函数,以球拍语言返回列表中的每三个元素
问题描述
尝试编写一个函数,该函数返回列表中的每三个元素,包括球拍中的第一个元素。我现在得到的只是我的代码第一个爆炸:
预期违反合同:(和/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)
解决方案
(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)
此解决方案不使用length
which 不必要地计算列表的长度
推荐阅读
- javascript - 从 API 解析数据,得到未定义
- html - 尝试从 Typescript 中的 Firestore 访问单个文档并将其传递给 HTML
- php - 带有一个登录页面的 Laravel 多重身份验证应用程序
- php - 仅在满足父模型的给定条件时如何获取模型关系
- javascript - JQuery 检查是否
- 包含特定文本
- elasticsearch - Elasticsearch - 根映射定义具有不受支持的参数
- sql-server - SQL Server 中浮点数据类型上算术运算符的可空性属性
- ssis - 带有单列的平面文件导入被截断到可用数据大小以下
- react-native - 如何在 expo/react-native 应用程序中添加自定义节点模块?
- javascript - 如何在 react.js 组件中将一个十六进制的值更改为另一个十六进制(简单方法)