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. ")))