2016-05-01 8 views
0

Schemeで再帰関数を作成するのに少し問題があります。私は再帰的にすべての力の追加を行うfoo(x)と呼ばれる関数を作成する必要があります。たとえば、foo(5)は5^4 + 4^3 + 3^2 + 2^1 + 1^0 = 701になります。 停止条件は、x = 0の場合はゼロを返します。スキームで再帰関数を作成しようとしていますか?

(define (foo x) 
    (cond ((zero? x) 0) 
    (else (+(expt(x (- x 1)))foo(- x 1))))) 

答えて

1

あなただけの括弧をより注意する必要があり、特定の通知に正しいこと:エルスそしてここで私は私の機能のために、これまで持っているもののx^X-1 +のfoo(X-1) 戻りますプロシージャを呼び出す方法は、次のようになります。(foo x)、代わりにfoo(x)。これはうまくいくはずです:

(define (foo x) 
    (cond ((zero? x) 0) 
     (else (+ (expt x (- x 1)) 
       (foo (- x 1)))))) 

(foo 5) 
=> 701 
0

私はコードを識別することができます。私はちょうど私が各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をプロシージャに評価する必要があります。いくつかの例外は、conddefineのような心の中で知る必要がある特別な形式ですが、かっこを追加することによってプログラムの意味を変更することが重要です。

あなたの手順の正しい定義は次のようになります。

(define (foo x) 
    (if (zero? x) 
     0 
     (+ (expt x (- x 1)) 
     (foo (- x 1))))) 

(foo 5) ; ==> 701 
ここ

condの機能のいずれも使用しなかったので、私はifからcondを変更しました。 condを参照してください私はいずれかの副作用または複数の述部を期待しています。

関連する問題