1

我正在学习 Scala 并有一个简单的问题:有人可以向我解释为什么以下两组代码会产生不同的结果吗?

def grey0(n: Int): List[List[String]]={
  if (n==0) List(Nil)
  else for(i<-List("0","1"); j<-grey0(n-1)) yield i :: j 
 }

相对

def grey1(n: Int): List[List[String]]={
  if (n==0) Nil
  else for(i<-List("0","1"); j<-grey0(n-1)) yield i :: j 
 }

第一个选项产生我正在寻找的结果。我不明白的是,为什么第二个选项只返回空列表?我会认为其他结果会影响它,如果有的话,我会得到某种平面列表而不是List[List[String]](这是我想要的)。

4

2 回答 2

1

在第一个示例中,您创建了一个包含空列表的列表。在第二个示例中,您只创建了一个空列表。两者可以具有相同的类型,因为任何列表都可以为空。

Nil只是表示空列表,它几乎等于List()(在您的示例中,类型将被推断,因此两者完全相同)。List(Nil)然后就像List(List())

于 2012-12-17T21:28:11.747 回答
1

在您的第一个版本grey0(0)中,将返回一个包含空列表的单元素列表。grey0(1)将为每个元素grey0(0)创建两个列表,因此您总共得到两个列表,因为grey0(0)包含一个列表。同样grey0(2)将包含 4 个列表,因为它为其中的两个元素中的每一个grey0(1)创建 2 个列表。

在您的第二个版本grey0(0)中将返回空列表。grey0(1)将为 中的每个元素创建两个列表grey0(0)。由于grey0(0)有 0 个元素,0*2=0因此结果中的元素总数。

于 2012-12-17T21:30:31.007 回答