Racket禁用make-list时如何实现按索引重复元素的expand函数
Racket Beginning Student环境下expand函数实现
实现思路
- 先自定义元素重复的辅助函数,替代被禁用的
make-list功能 - 主函数通过带重复次数累加器的递归遍历原列表,生成目标嵌套列表
完整代码
; 辅助函数:将元素x重复n次,返回生成的列表 (define (repeat-n x n) (cond [(zero? n) empty] [else (cons x (repeat-n x (- n 1)))])) ; 内部递归辅助函数:跟踪当前位置需要重复的次数 (define (expand-helper lst current-count) (cond [(empty? lst) empty] [else (cons (repeat-n (first lst) current-count) (expand-helper (rest lst) (+ current-count 1)))])) ; 对外暴露的主函数 (define (expand lst) (expand-helper lst 1))
调用验证
测试输入:(expand (list "a" "b" "c"))
返回结果:(list (list "a") (list "b" "b") (list "c" "c" "c"))
逻辑说明
repeat-n用基础递归实现重复逻辑:次数为0时返回空列表,否则每次将目标元素追加到少一次的重复结果前expand-helper额外携带current-count参数记录当前位置需要重复的次数,初始调用时传入1(对应原列表索引0的元素重复1次),每处理一个元素就把次数加1- 全部语法符合Beginning Student环境规范,没有用到任何禁用内置函数
内容的提问来源于stack exchange,提问作者MaAsh3435
相关产品推荐
相关产品推荐

