Nil vs List(Nil)in for a recursion

时间:2012-12-17 21:23:31

标签: list scala recursion

我正在学习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]](这就是我想要的)。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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