You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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))))
      '()))

原代码的问题分析

  1. 语法错误:print函数的条件判断(if not(number? value))不符合Scheme的if语法结构(正确结构是(if 条件 真值分支 假值分支)),且判断对象错误——应该校验第二个参数size是否为数字,而非第一个参数。
  2. 逻辑错误:辅助函数print-helper的递归逻辑完全偏离需求,(append(+ value 1) (cdr size))中,+ value 1仅对数字有效(但value可能是非数字),cdr size对数字类型无效(cdr仅适用于列表),整体递归参数传递逻辑和构建重复列表的目标无关。

内容的提问来源于stack exchange,提问作者UnknownPeach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:15:30