5

ここのコードは、次のような数値を生成できます[1 -2 3 -4 5 -6 7 -8 9 -10 ...]

(define (integers-starting-from n)
  (cons-stream n (stream-map - (integers-starting-from (+ n 1)))))

それが交互の記号を生成する方法をよく理解していません。誰かが私がこれを視覚化するのを助けるために私にもっと良い説明を教えてもらえますか?

mit-schemeでコードを実行できます。

4

2 に答える 2

7

このように考えてみましょう:

整数の無限のストリームを生成しすぎると、

(define (integers-starting-from n)
  (cons-stream n (integers-starting-from (+ n 1))))

これは次のようなものになります(n = 1から開始する場合):

(+1 +2 +3 +4 +5 ...)

ここで、2番目の場所からすべての要素を取得し、それらの符号を反転するとします。

(+1 -2 -3 -4 -5 ...)

3位以降も同じようにしましょう。

(+1 -2 +3 +4 +5 ...)

次の場所から開始するたびに、さらに2回繰り返します。

(+1 -2 +3 -4 -5 ...)
(+1 -2 +3 -4 +5 ...)

ご覧のとおり、各要素の後に残りの整数ストリームを追加すると、その符号を反転した後(残りのストリームの符号を反転)、正確に必要なもの、つまり交互の符号を持つ整数のストリームが得られます。stream-mapストリームの残りの部分でwithを使用して符号を反転するたび-に、「ストリームの残りの部分」はから始まるストリームになります(+ n 1)

それをすべてまとめればcons-stream、あなたはそれを持っているはずです。

于 2011-06-10T14:11:54.587 に答える
1
(cons-stream n (stream-map - (integers-starting-from (+ n 1)))))

は2つのことを行っています。まずcons-stream、値nと値の形式を評価(stream-map - (integers-starting-from (+ n 1)))します。これは、のモナドの場合が-否定されるため、ストリームの反転になります。したがって、あなたの交互のパターン。

関数名から、このようなものを探しているようです

(define (integers-starting-from n)
  (cons-stream n (integers-starting-from (+ n 1))))
于 2011-06-10T14:14:07.177 に答える