Recursion 我得到了;计划申请不是一个程序”;在函数的最后一次递归调用中

Recursion 我得到了;计划申请不是一个程序”;在函数的最后一次递归调用中,recursion,if-statement,scheme,racket,Recursion,If Statement,Scheme,Racket,下面是代码: (define (time-prime-test n) (newline) (display n) (start-prime-test n (runtime))) (define (start-prime-test n start-time) (if (prime? n) (report-prime (- (runtime) start-time)))) (define (report-prime elapsed-time) (display "

下面是代码:

(define (time-prime-test n)
  (newline)
  (display n)
  (start-prime-test n (runtime)))

(define (start-prime-test n start-time)
  (if (prime? n)
      (report-prime (- (runtime) start-time))))

(define (report-prime elapsed-time)
  (display " *** ")
  (display elapsed-time))

(define (search-for-primes n m)
  (if (< n m) 
      ((time-prime-test n)
       (search-for-primes (+ n 1) m))
      (display " calculating stopped. ")))
(search-for-primes 100000 100020)
(定义(时间素数测试n)
(新行)
(显示n)
(启动主测试n(运行时)))
(定义(开始基本测试n开始时间)
(如果(素数?n)
(报告主时间(-(运行时)开始时间)))
(定义(报告主要运行时间)
(显示“***”)
(显示经过的时间)
(定义(搜索素数n m)
(如果(
在显示“计算停止”后,我得到了这个错误。如下图所示:

100017 100018 100019*54计算停止。应用:不是一个程序;需要一个可应用于参数的过程
给定:#
参数…:
#

这将尝试将
时间初始测试的结果作为程序应用<代码>时间初始测试
不返回过程。使用
开始

  (begin
   (time-prime-test n)
   (search-for-primes (+ n 1) m))
(define (search-for-primes n m)
  (if (< n m)
      (begin
        (time-prime-test n)
        (search-for-primes (+ n 1) m))
      (display " calculating stopped. ")))

您打算在
if
的后续部分中执行两个表达式,但是
if
只允许在后续部分中使用一个表达式,在备选部分中使用一个表达式

将两个表达式括在括号中(正如您所做的那样)将不起作用:结果表达式将作为第一个表达式的函数应用程序进行计算,第二个表达式作为其参数,产生错误
“应用程序:不是过程;应为可应用于参数的过程…”
,因为
(时间素数测试n)
的计算结果不是一个过程,所以它的计算结果是

您可以使用
cond
来解决此问题:

(define (search-for-primes n m)
  (cond ((< n m)
         (time-prime-test n)
         (search-for-primes (+ n 1) m))
        (else
         (display " calculating stopped. "))))

注意:如果在DrRacket中运行此操作,IDE的错误突出显示应该围绕导致问题的函数应用程序。你看到了吗?谢谢你的详细回答!我现在无法证实,因为我在工作,我认为你在这方面是绝对正确的。
(define (search-for-primes n m)
  (if (< n m)
      (begin
        (time-prime-test n)
        (search-for-primes (+ n 1) m))
      (display " calculating stopped. ")))