2011-07-02 5 views
2

私は次のように再帰を使用してGray Codesためのストリーム作った:例えばただ1つの要素から再帰ストリームを作成しますか?

scala> gray(2) 
res17: List[String] = List(00, 01, 11, 10) 

のために、私は本当にリストを必要としないように

val gray: Stream[List[String]] = { 
List("") #:: List("0", "1") #:: gray.tail.map {gnext} 
} 

val gnext = (i:List[String]) => i.map {"0" + _} ::: i.reverse.map {"1" + _} 

をそれは要素0から生成することができるので、定義内の「0」、「1」):

scala> gnext(List("")) 
res18: List[java.lang.String] = List(0, 1) 

最初の要素からストリームを生成するために使用できるウェイ/パターンはありますか?

答えて

3
val gray: Stream[List[String]] = List("") #:: gray.map {gnext} 

あるいは、

val gray = Stream.iterate(List(""))(gnext) 
+0

クール、ちょうど全体のリストの代わりに、尾を使用しています。私は最初のバージョンがメモされると言っても間違いないでしょうが、 'iterate'のバージョンはそうではありませんか? –

+0

@Luigiも 'グレー'は関数なので、私はメモを適用するとは思わない。 –

+0

良い点 - 両方のストリームオブジェクトです。私が理解しているように、 'Stream'は怠惰な' List'sなので、新しい 'gray'オブジェクトで' gray(10) 'を参照すると時間がかかりますが、' gray(8)その値はすでに計算されているため、即座に表示されます。つまり、自動メモ作成のようなものです。 –

関連する問題