私はコードを識別することができます。私はちょうど私が各1行に+
に引数を置くDrRacketでそれを貼り付けCTRL +を打つ:
(define (foo x)
(cond ((zero? x) 0)
(else (+ (expt (x (- x 1)))
foo
(- x 1)))))
だから、基本ケースはOKですが、デフォルトのケースは非常にオフになります。 x
はプロシージャとして扱われます。これはそのまわりにかっこがあり、-
も数字のようにx
を使用します。それは両方になることはできません。 +
は、すべての引数が数値であることを期待する一方で、それは、手続き値を評価するように、それはがそれを囲む括弧を持っていないので、
foo
は適用されません。
Schemeの規則は、かっこの問題です。 x
と(x)
は全く異なる2つのものです。最初のx
は任意の値にすることができますが、(x)
はアプリケーションなので、x
をプロシージャに評価する必要があります。いくつかの例外は、cond
とdefine
のような心の中で知る必要がある特別な形式ですが、かっこを追加することによってプログラムの意味を変更することが重要です。
あなたの手順の正しい定義は次のようになります。
(define (foo x)
(if (zero? x)
0
(+ (expt x (- x 1))
(foo (- x 1)))))
(foo 5) ; ==> 701
ここ
cond
の機能のいずれも使用しなかったので、私はif
からcond
を変更しました。 cond
を参照してください私はいずれかの副作用または複数の述部を期待しています。