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

实现SICP习题1.11递归函数时Racket报错求助

排查Racket实现SICP习题1.11递归函数的报错问题

嘿,我一眼就看到你代码里的语法问题了——这是Scheme/Racket里新手很容易犯的函数调用格式错误!

错误原因分析

你写的函数调用f((- n 1))不符合Racket的语法规则。在Racket中,函数调用必须是(函数名 参数...)的形式:

  • 你写的f((- n 1))会被解释器理解为:先计算(- n 1)得到一个数值(比如当n=5时结果是4),然后试图把这个数值当作一个可调用的过程(procedure),并把f作为参数传给它。但数值显然不是函数,所以解释器就抛出了application: not a procedure的错误。

修正后的代码

把所有错误的函数调用格式改成正确的(f 参数)形式即可:

#lang sicp

(define (f n)
  (cond ((< n 3) n)
        (else (+ (f (- n 1))
                 (* 2 (f (- n 2)))
                 (* 3 (f (- n 3)))))))

(f 2)  ; 运行结果:2
(f 5)  ; 运行结果:25

关键修正点

  • 把f((- n 1))改为(f (- n 1))
  • 把f((- n 2))改为(f (- n 2))
  • 把f((- n 3))改为(f (- n 3))

这样解释器才能正确识别:你是要调用f函数,传入(- n 1)等计算后的数值作为参数。

验证结果

运行修正后的代码:

  • (f 2)直接返回2(符合(< n 3)的分支逻辑)
  • (f 5)的计算过程是:f(5) = f(4) + 2*f(3) + 3*f(2),最终结果为25,完全符合习题1.11的递归定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:48:12