如何在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
错误原因分析
你之前的写法存在两个核心问题:
- 返回值类型错误:
display过程执行后返回的是#!unspecific(无特定值),而非需要的数值类型,直接将其作为分支返回值会触发类型错误。 - 重复递归调用:如果分开写
display和递归计算逻辑,会导致同一递归分支被执行两次,既浪费计算资源,又会造成输出混乱。
实现思路说明
- 先打印当前调用的参数前缀(不换行),预留输出位置。
- 使用
let绑定递归计算的结果,确保递归逻辑只执行一次。 - 打印返回值后缀并换行,补全当前调用的完整输出行。
- 最后返回计算结果,保证函数返回正确的数值类型,符合Scheme的函数要求。
内容的提问来源于stack exchange,提问作者glockr
相关产品推荐
相关产品推荐

