2017-11-20 24 views
0

私はSchemeの初心者ですが、私が書こうとしていることは非常に単純なようです。私がしようとすると、スキーム:エラー:#<undef>は関数ではありません

(define (expt x n) 
    (cond ((= n 0) 1) 
     ((= n 1) x) 
     ((= n -1) (/ 1 x)) 
     ((< n 0) (* (/ 1 x) (expt x (+ n 1)))) 
     (else (* x (expt x (- n 1))))) 

機能exptが正しく動作するようだが:本家、私は欠けているものがある...私は、次の定義があります。

(define (fast-expt x n) 
    (if (even? n) 
     (expt (expt x (/ n 2)) 2) 
     (expt x n))) 

をし、それは私の前の関数を使用していますfast-exptをテストすると、それは私に以下を投げます:Error: #<undef> is not a function [fast-expt]。問題があれば、私はオンラインコンパイラを使用します。

答えて

1

works for meただし、exptには閉じ括弧がありません。オンラインインタープリタでfast-exptの前にexptを定義する必要があるかもしれません。それとも、Racketのような良いオフラインインタープリタに切り替えるのが良いでしょうか?:)

また、fast-exptの実装はそれ自身を呼び出す必要があります。それ以外の場合は、最初の偶数指数でのみ機能し、その時点から「遅い」exptが使用されます。

(define (square x) (* x x)) 

(define (fast-expt x n) 
    (cond ((zero? n) 1) 
     ((even? n) (square (fast-expt x (/ n 2)))) 
     (else (* x (fast-expt x (- n 1)))))) 
+0

はい、私は 'fast-expt'の前に' expt'を定義しましたが、それでも私のために働きません。あなたのコードをコピーして貼り付けるときでも、私は本当に混乱しています。私はDrRacketエディタでもインストールして試してみます。repl.itコンパイラの中にあるかもしれません。そして、 'fast-expt'関数への改良に感謝します:) – barni

+0

@barni私はあなたのコードが閉じた括弧がありません。私の更新された答えを見てください。そして、私は[repl.itでテストしました](https://repl.it/repls/HarmoniousBlueLeafbird)、うまくいきます。 –

+0

ええ、DrRacketでコードを実行すると、私はまったく同じようにスローされます...ちょうどカッコです..どのような愚かな間違い!どうもありがとうございました:) – barni

関連する問題