实现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
相关产品推荐
相关产品推荐

