0

我正在玩 Scala 的流,但我不确定我是否明白这个想法。让我们考虑以下代码

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head, fun(s.tail))

执行这个

val f = fun(Stream.from(7))
f take 14 foreach println

结果与

7 8 9 10 ... up to 20

假设我明白这一点。

现在,稍微更改代码(将 2 添加到头部)

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head + 2, fun(s.tail))

结果是

9 10 11 ... up to 22

我想我又明白了。问题从下一个例子开始(d

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head / 2, fun(s.tail))

3 4 4 5 5 6 6 7 7 8 8 9 9 10

这个我不明白,请解释为什么会这样?类似地,减法也不像我预期的那样

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head - 2, fun(s.tail))

输出

5 6 7 8 9 10 ... up to 18
4

3 回答 3

1

鉴于您的“接受”:7 8 9 10 ... up to 20

  • 当你+ 2在每个元素上会发生什么?

  • 当你/ 2处理每个元素(int算术)时会发生什么?

  • 当你- 2在每个元素上会发生什么?

于 2013-07-25T21:16:41.517 回答
0

如果您将其视为映射,它会更直观Stream吗?

scala> val s1 = Stream.from(10)
s1: scala.collection.immutable.Stream[Int] = Stream(10, ?)

scala> val s2 = s1 map (_ * 2)
s2: scala.collection.immutable.Stream[Int] = Stream(20, ?)

scala> s2.take(5).toList
res0: List[Int] = List(20, 22, 24, 26, 28)

scala> val s3 = s1 map (_ / 2)
s3: scala.collection.immutable.Stream[Int] = Stream(5, ?)

scala> s3.take(5).toList
res1: List[Int] = List(5, 5, 6, 6, 7)

scala> val s4 = s1 map (_ - 2)
s4: scala.collection.immutable.Stream[Int] = Stream(8, ?)

scala> s4.take(5).toList
res2: List[Int] = List(8, 9, 10, 11, 12)
于 2013-07-25T21:44:20.233 回答
0

好吧,让我们尝试分解它...

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head, fun(s.tail))

是一个函数,它接受 a并将其与Stream分开,将自身递归地应用于,然后将两个结果与运算符重新组合。headtailtailcons

由于head在此操作期间未触及 ,因此将Stream像以前一样逐个元素地重建 。

val f = fun(Stream.from(7))

f它与Stream.from(7)[即从 7 开始的无限递增整数序列]相同

打印f take 14实际上表明我们有从 7 开始的前 14 个数字[即 7,8,9,...,20]

接下来发生的是,在使用 重建流时cons,每个元素都以某种方式进行了修改

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head + 2, fun(s.tail))

这在将其与修改后的重新组合之前添加了 2。后者以相同的方式修改,它的第一个元素被添加到 2 然后重新组合到它自己的,所以自己的。headtailtail

如果我们再次假设它s包含从 7 开始的数字,会发生什么看起来像

fun(s) = cons(7 + 2, cons(8 + 2, cons(9 + 2, ... ad infinitum ... )))))

这与向流的每个元素添加 2 相同s

代码通过打印“9 到 22”来确认这一点,这正是“7 到 20”,每个元素都添加了 2。

其他例子类似:

  • 每个元素除以 2的流(并四舍五入到整数值,因为Stream是用值键入的Int
  • 每个元素减 2的流
于 2013-07-25T22:23:04.107 回答