1. ホーム
  2. recursion

[解決済み] 最後の関数の再帰呼び出しで「scheme application not a procedure」と表示された

2022-02-17 20:52:38

質問

というわけで、以下はそのコードです。

(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)

と表示された後、以下のようなエラーが発生しました。

100017 100018 100019 * 54 計算が止まった . . アプリケーション: プロシージャではなく、引数に適用できるプロシージャを期待する
を与えた。#<void>
の引数は...:
#<void>

解決方法は?

の帰結部分の中で、2つの式を実行するつもりです。 if しかし if は、結果的に1つ、代替的に1つの式しか許さない。

両方の式を括弧で囲んでも(あなたのように)うまくいきません。結果として生じる式は、2番目の式を引数として最初の式を関数で適用したものとして評価され、次のようなエラーが発生します。 "application: not a procedure; expected a procedure that can be applied to arguments ..." なぜなら (time-prime-test n) はプロシージャとして評価されないため、この結果は #<void> .

を使用するかで、問題を解決することができます。 cond :

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

または begin :

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