1

私は Scala を学んでいて、簡単な質問があります。次の 2 つのコード セットが異なる結果をもたらす理由を誰か説明してもらえますか?

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 
 }

最初のオプションは、私が探している結果をもたらします。私が理解できないのは、なぜ2番目のオプションが空のリストを返すだけなのですか? 私は他の結果がそれに不利になると思っていたでしょうし、どちらかといえば、List[List[String]](私が欲しいものです)ではなく、ある種のフラットリストを取得するでしょう。

4

2 に答える 2

1

最初の例では、空のリストを含むリストを作成します。2 番目の例では、空のリストのみを作成します。どのリストも空である可能性があるため、どちらも同じ型を持つことができます。

Nil空のリストを意味するだけで、ほぼ同じですList()(例では型が推測されるため、両方がまったく同じです)。List(Nil)のようなものList(List())です。

于 2012-12-17T21:28:11.747 に答える
1

最初のバージョンgrey0(0)では、空のリストを含む 1 要素のリストが返されます。grey0(1)の各要素に対してgrey0(0)2 つのリストを作成するため、リストが 1 つ含まれているため、合計 2 つのリストが得られますgrey0(0)。同様grey0(2)に、2 つの要素のそれぞれに対して 2 つのgrey0(1)リストが作成されるため、4 つのリストが含まれます。

2 番目のバージョンgrey0(0)では、空のリストが返されます。grey0(1)の各要素に対して 2 つのリストを作成しますgrey0(0)。要素が 0 であるため、結果grey0(0)の要素の合計になります。0*2=0

于 2012-12-17T21:30:31.007 に答える