我正在阅读sicp并正在编写一个程序,以便从1,000中找到前3个素数。我使用的是Fermat方法的改进版本(但是在这种情况下算法无关紧要,因为我只需要理解错误信息)。整套代码是:
(define (fz-prime number count)
(if (< count 4)
(if (= (fz-fermat-loop number 1) 0)
(fz-prime (+ number 1) count)
((display number) (fz-prime (+ number 1) (+ count 1))))))
(define (fz-fermat-loop number count)
count
(if (> count 5)
1
(if (= (fz-fermat-test number (fz-random number)) 0)
0
(fz-fermat-loop number (+ count 1)))))
(define (fz-fermat-test number count)
(if (= (modulo count number) (modulo (fz-exp-wrapper count number) number))
1
0))
(define (fz-random number)
(random (- number 2)))
(define (fz-exp-wrapper base power)
(fz-exp base power 1))
(define (fz-exp base power result)
(if (<= power 0) result
(fz-exp base (- power 1) (* result base))))
(fz-prime 1000 1)
现在每次运行代码时,都会显示以下错误:
100910131019. . application: not a procedure;
expected a procedure that can be applied to arguments
given: #<void>
arguments...:
前3个数字是前三个素数,但我不知道错误信息的内容。
答案 0 :(得分:2)
错误消息表明您正在使用Racket,但您还选择了禁用有用错误消息的语言级别,例如我在#lang中将程序复制到缓冲区时所获得的错误消息球拍语言:
if: missing an "else" expression in: (if (< count 4) (if (= (fz-fermat-loop number 1) 0)
(fz-prime (+ number 1) count) ((display number) (fz-prime (+ number 1) (+ count 1)))))
实际上,我打赌你正在使用Jens Axel Soegaard的优秀sicp
语言,这完全是通过sicp工作的正确选择....但遗憾的是遗漏了一些有用的错误消息
具体来说,在您使用的语言中,if
可能缺少else
分支,如果测试失败,则会静默评估特殊#值。
哦!可是等等!你还有另外一个问题......你写了
((display number) (fz-prime (+ number 1) (+ count 1)))
我打赌你认为如果你只是采用(display number)
和(fz-prime ...)
之类的两个表达并将它们包裹在parens中,这意味着&#34;做第一个,然后执行第二&#34。实际上,这意味着&#34;第一个表达式求值为一个函数;用它来评估剩余的表达式&#34;来调用它。而#void
正是(display ...)
返回的内容。
您可能正在寻找begin
,就像这样:
(begin
(display number)
(fz-prime (+ number 1) (+ count 1)))