You need to enable JavaScript to run this app. Scheme实现两列表最小两两乘积函数遇过程调用错误求助
优惠活动
大模型
产品
解决方案
定价
更多

Scheme实现两列表最小两两乘积函数遇过程调用错误求助

问题定位与修正

报错的直接原因

你遇到的not a procedure; given: '(1 2 3)报错,本质是对Scheme的函数调用语法理解有误:

  • Scheme中所有函数调用的标准格式是(函数名 参数1 参数2 ...),不需要给单个参数额外套括号。
  • 你当前写的(myListLeast(LstOne))结构,会被解释器拆成两部分求值:首先查找myListLeast的变量绑定,再对参数表达式(LstOne)求值。而LstOne是传入的列表'(1 2 3),解释器会尝试把这个列表当作可执行的函数调用,自然就抛出“不是可应用过程”的错误。

代码逻辑层面的错位

除了语法问题,你的代码和需求目标还有几处核心偏差:

  • 辅助函数名和功能不匹配:你说明自己编写了“获取列表最小整数”的辅助函数,但实际贴出的代码名为myListMax,实现的是求列表最大值的逻辑;后续smallProd中调用的myListLeast(求最小值)从头到尾没有定义,哪怕语法修正后也会触发“未定义变量”报错。
  • 实现逻辑和目标不符:你当前smallProd的写法是“取列表1的最小值 * 列表2的最小值”,但实际需求是两个列表相同索引位置的元素两两相乘,生成同长度的乘积列表后,再找这个乘积列表的最小值。比如示例中两个列表[2,6,3]和[4,6,2],正确流程是先生成乘积列表[8,36,6],再取最小值6,而不是两个列表各自最小值相乘得到4。
  • 括号不匹配:你写的smallProd代码左括号数量多于右括号,本身就无法通过语法解析。
  • 已有辅助函数的边界问题:你写的myListMax对空列表返回0,这种设计如果用来求最小值,遇到全为负数的列表会出现计算错误。

可运行的修正代码

  1. 实现正确的求列表最小值的辅助函数(替换逻辑错位的myListMax,调整空列表处理逻辑避免计算偏差):
    (define (myListLeast Lst)
      (if (null? Lst)
          (error "空列表无法计算最小值")
          (if (null? (cdr Lst))
              (car Lst)
              (if (< (car Lst) (myListLeast (cdr Lst)))
                  (car Lst)
                  (myListLeast (cdr Lst)))))
      )
    
  2. 补充逐元素相乘的辅助函数,生成对应位置的乘积列表:
    (define (pairwise-multiply LstOne LstTwo)
      (if (or (null? LstOne) (null? LstTwo))
          '()
          (cons (* (car LstOne) (car LstTwo))
                (pairwise-multiply (cdr LstOne) (cdr LstTwo))))
      )
    
  3. 修正后的smallProd函数:
    (define (smallProd LstOne LstTwo)
      (myListLeast (pairwise-multiply LstOne LstTwo))
      )
    
    测试验证:
    • 输入(smallProd '(2 6 3) '(4 6 2)),输出6,和需求示例一致
    • 输入之前报错的测试用例(smallProd '(1 2 3) '(4 5 6)),逐位相乘得到[4,10,18],输出最小值4,无报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 01:15:03