2012-02-11 9 views
11

Schemeで始まったばかりです。私はコンソールでの印刷に問題があります。例を印刷 単純なリスト:スキームコンソール印刷

(define factorial 
    (lambda (n) 
    (cond 
     ((= 0 n) 1) 
     (#t (* n (factorial (- n 1))))))) 

私は、関数が呼び出されるたびにnを印刷したいです。私は同じ機能の中でそれをすることができないと思いましたか?印刷できるように別の関数を呼び出す必要がありますか?

答えて

22

display(おそらくnewline)を呼び出してSchemeで印刷します。 関数(またはScheme、functional-ishの場合)では、呼び出された関数の副作用のみが意味を持つ)何かの前後に順番に呼び出す必要があるので、通常はbeginは順番にその引数を評価し、最後の部分式の値を返します。ただし、lambdaには暗黙的にこのようなbeginが含まれています。

だからあなたの場合には、それは次のように行くだろう:

(lambda (n) 
    (display n) (newline) 
    (cond [...])) 

二つの発言:

  1. あなたは(define factorial (lambda (n) [...]))の省略形として(define (factorial n) [...])使用することができます。
  2. factorialの実装方法はtail call-optimizationを禁止していますので、プログラムは大きな値のnに対してかなりのスタック領域を使用します。ただし、アキュムレータを使用して最適化可能な形式に書き換えることは可能です。その後、

    (define (factorial n) 
        (display n) (newline) 
        (inner-factorial n)) 
    

    そしてinner-factorialにあなたの関数の名前を変更:

あなたは一度だけnを印刷したい場合は、ユーザーが関数を呼び出したとき、あなたは確かにこのように、ラッパーを記述する必要があります。

+0

ラムダボディ内でbeginを実行する必要はありません。 –

+0

ああ!しかし、状況の後の印刷はいかがですか?私は実際に階乗には取り組んでいないが、それを説明するのは簡単だ。条件が真である場合にのみ印刷のようなもの、すなわちn!= 0なら印刷する。 – ercliou

+1

私は 'begin'について部分を修正しました。 'cond'節の本体には複数の式が含まれることもあるので、' display'を簡単に呼び出すことができます。 – fnl