2016-09-29 7 views
0

スキームの再帰を使用してforループを作成したいと思います。スキームで再帰を使用して値を返す

私は2で停止再帰コードを書きましたが、それは

数を返しません。

JAVAでコードを書く場合、

これは次のようになります。関数はスキームでは、私は

(define (IT n) 
    (let ((i n)) 

(if (= i 2) "done" 


    (IT(- n 1)) 

    )  
) 
) 

スキームは、このコードの動作

(+ i 0) 
をさせていないしようとした2

到達するまで、私は、私を変え得ることができるように

global varialbe int i; 

public int decreasingNumber(int n) 
{ 
if (n == 2) 
    return -1 
else 
{ 
    i = n 
    return decreasingNumber(n - 1) 
} 
} 

再帰の前に

+0

Javaコードが正しくありません - まず、再帰の状態を更新するための外部属性に依存しないでください。次に、再帰によって返された値で何もしていないので、常に-1を返します。私が 'declineNumber(10)'を呼び出すと、期待された結果はどうでしたか? –

+0

'set! 'を使って最上位の変数を変更することができます。これは' define'で最初に定義しなければなりません。そのような基本的な作業のために可変なグローバル変数を使用することは、Schemeの精神に反します。これがなければ何かが達成できるならば、それは通常はすべきです。 –

答えて

1

Javaでグローバル変数を作成し、Schemeでローカル変数を作成しています。あなたがこれを行うにした場合:

public static int decreasingNumber(int n) { 
    if (n == 2) { 
     return -1; 
    } else { 
     int i = n; // dead code 
     return decreasingNumber(n - 1); 
    } 
} 

int minusOne = decreasingNumber(10); 
System.out.println(i + 0); // compilation error!!! i doesn't exist 

idecreasibngNumberを呼び出した後は存在しませんだから、なぜあなたは参照してください? もしITが文字列 "done"以外の何かを返そうとするなら、あなたはおそらく "done"をあなたが返すものと置き換えます。

(define (count-down-to-two n) 
    (if (= n 2) 
     -1        ; return -1 (why?) 
     (count-down-to-two (- n 1)))) ; return the result of this recursion 

しかし、これを簡略化することができる見ることは私が代わりにこれを書きたくなる:

(set! i n) ; like i = n in java 
:(近くには、とき、または字句) set!で行うことができます

; simplified version 
(define (count-down-to-two n) 
    -1) 

は、グローバル変数を設定します

多くの場合、プロシージャを必要なものだけ戻して、コードを機能的かつ簡単にするst。ブックやチュートリアルを通して、この新しい言語(lispファミリの中)で全く異なるプログラミング言語(algolファミリ)のアイディアを使用しようとするのではなく、それを慣用的にする方法を学びましょう。

関連する問題