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

Scheme报错‘application: not a procedure’咨询(SICP素数程序开发)

解析Scheme错误:"application: not a procedure"

我一看你这段代码就知道问题出在哪了——这是Scheme新手很容易踩的一个语法坑!

错误根源

你的fz-prime函数里有这么一行:

((display number) (fz-prime (+ number 1) (+ count 1)))

在Scheme里,任何被一对括号包裹的表达式都会被当作「过程调用」。这里外层的括号会先执行(display number),然后试图把这个表达式的返回值当成一个可调用的过程,再把后面的(fz-prime ...)作为参数传给它。但display是一个仅做副作用的过程,它的返回值通常是#<void>(或者具体实现里的非过程值),根本不是能被调用的过程,所以解释器直接抛出了application: not a procedure错误。

修正方法

你这里的需求是先打印找到的素数,再递归继续查找,应该用begin来把多个表达式组合成一个执行序列(因为Scheme的if分支里只能放单个表达式,多个表达式必须用begin包裹)。修正后的fz-prime函数片段如下:

(define (fz-prime number count)
  (if (< count 4)
      (if (= (fz-fermat-loop number 1) 0)
          (fz-prime (+ number 1) count)
          (begin
            (display number)
            (newline) ; 可选,让每个素数换行显示更清晰
            (fz-prime (+ number 1) (+ count 1))))))

另外,我注意到你写的fz-fermat-loop函数开头有个孤立的count,这行代码完全无效——它只是返回count的值但没有任何实际作用,建议直接删掉,避免冗余。

补充小提示

你要找从1000开始的前3个素数,初始调用应该是(fz-prime 1000 1)哦,这样count从1开始计数,直到找到3个素数后停止递归。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:52:58