【问题标题】:Nil vs List(Nil) in a for with recursionNil vs List(Nil) in a for with recursion
【发布时间】:2012-12-05 00:51:44
【问题描述】:

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

【问题讨论】:

    标签: list scala recursion


    【解决方案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 个元素。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2015-05-28
        • 2022-11-08
        相关资源
        最近更新 更多