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

如何在Scheme中返回值前打印该值?(基于SICP代码修改)

解决方案:修改Scheme函数以打印调用参数及返回值

正确实现代码

(define (whatever x y)
  (display "called with ")
  (display x)
  (display " ")
  (let ((result (if (> x y)
                    0
                    (+ x (whatever (+ 1 x) y)))))
    (display "returning ")
    (display result)
    (newline)
    result))

调用验证

执行(whatever 1 5)会得到预期输出:

called with 1 returning 15
called with 2 returning 14
called with 3 returning 12
called with 4 returning 9
called with 5 returning 5
called with 6 returning 0
;Value: 15

错误原因分析

你之前的写法存在两个核心问题:

  1. 返回值类型错误:display过程执行后返回的是#!unspecific(无特定值),而非需要的数值类型,直接将其作为分支返回值会触发类型错误。
  2. 重复递归调用:如果分开写display和递归计算逻辑,会导致同一递归分支被执行两次,既浪费计算资源,又会造成输出混乱。

实现思路说明

  1. 先打印当前调用的参数前缀(不换行),预留输出位置。
  2. 使用let绑定递归计算的结果,确保递归逻辑只执行一次。
  3. 打印返回值后缀并换行,补全当前调用的完整输出行。
  4. 最后返回计算结果,保证函数返回正确的数值类型,符合Scheme的函数要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:32:22