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

