0
#lang eopl

  (define (expo  base n  )
         (cond( (or  (= base 1) (= n 0) ) 1)
                  (else ( (* base (expo(base (- n 1))) )   ) )))

-> (enter! "expo.rkt")
"expo.rkt"> (expo (2 1) )
; application: not a procedure;
;  expected a procedure that can be applied to arguments
;   given: 2
; [,bt for context]

単純な再帰累乗を作成しようとしていますが、上記のエラーが発生します。コードは自明です。私はラケットプログラミングの初心者です。マニュアルを読んでいますが、エラーが見つかりません。おそらく、関数がプロシージャではなく void を返すため、エラーが表示されますが、void を返す理由がわかりません。1 または計算を返します。助けてください :/

4

3 に答える 3

3

かっこの位置が間違っています。これでエラーが解決するはずです:

(define (expo base n)
  (cond ((or (= base 1) (= n 0)) 1)
        (else (* base (expo base (- n 1))))))

そして、これはあなたがそれを呼び出す方法です:

(expo 2 3)
=> 8

記録のために:Schemeでは括弧のペアは関数適用を意味するので、あなたが書くとき(2 3)、インタプリタはそれ2が関数で3あり、その引数であると考えます...明らかにそれはうまくいきません。

そのため、それらを配置する場所には非常に注意する必要があります。それら()は世界にすべての違いをもたらします! 物事を簡単にするために、括弧のマッチングと適切な構文の色付けを備えた優れた IDE を使用し、インデントをさらに整理します。コメントで @dyoo が示唆しているように、DrRacket は優れた選択肢です。

于 2013-09-19T03:57:10.083 に答える
0

構文形式は、conda) 3 つ以上の句がある場合、または b) 1 つまたは複数の句に対して実行する一連のコマンド/式がある場合に最適です。これら 2 つのケースは、コードには当てはまりません。したがって、次のように使用すると、より明確なコードが得られます (理解しやすく、修正しやすくなります) if

(define (expo base n)
  (if (or (= base 1) (= n 0))
      1
      (* base (expo base (- n 1)))))

また、いくつかの「良い」コードの間隔とインデントを調べてください。それはあなたの理解を大いに助けるでしょう。

于 2013-09-19T04:08:08.613 に答える
0

関数を呼び出すときは、次のように記述します

(expo 2 1)

それよりも

(expo (2 1))

再帰関数の定義の定義も同様です。

また、この部分には二重ブラケットがあり、不要です。

( (* base (expo(base (- n 1))) )
于 2013-09-19T03:17:21.337 に答える