如何在Scheme(R5RS)中用append/cons实现自定义make-list函数?
Scheme R5RS 实现自定义重复列表生成函数
需求回顾
实现一个函数,接收两个参数:
- 第一个参数是要重复的值
- 第二个参数是重复次数(必须为正整数)
- 若第二个参数不是数字(即参数顺序颠倒),返回空列表
'() - 正确调用时返回由指定值重复指定次数组成的列表
正确实现方案(推荐用cons,效率更高)
(define (print value size) ; 先校验第二个参数是否为正整数,不符合则返回空列表 (if (and (number? size) (positive? size)) ; 内部递归辅助函数,用cons构建列表(O(n)时间,常数空间开销) (let loop ((remaining size) (result '())) (if (= remaining 0) result (loop (- remaining 1) (cons value result)))) '()))
测试用例验证
(print 5 5)→(5 5 5 5 5)(print 'Ana 3)→(Ana Ana Ana)(print 3 'Ana)→()(print "hello" 0)→()
用append的实现(效率较低,仅作参考)
如果一定要用append,可以这样写,但注意append每次都会遍历已有列表,大次数场景下效率不如cons版本:
(define (print value size) (if (and (number? size) (positive? size)) (if (= size 1) (list value) (append (list value) (print value (- size 1)))) '()))
原代码的问题分析
- 语法错误:
print函数的条件判断(if not(number? value))不符合Scheme的if语法结构(正确结构是(if 条件 真值分支 假值分支)),且判断对象错误——应该校验第二个参数size是否为数字,而非第一个参数。 - 逻辑错误:辅助函数
print-helper的递归逻辑完全偏离需求,(append(+ value 1) (cdr size))中,+ value 1仅对数字有效(但value可能是非数字),cdr size对数字类型无效(cdr仅适用于列表),整体递归参数传递逻辑和构建重复列表的目标无关。
内容的提问来源于stack exchange,提问作者UnknownPeach
相关产品推荐
相关产品推荐

