2012-12-17 3 views
1

스칼라를 배우고 있으며 빠른 질문이 있습니다. 다음 두 세트의 코드가 다른 결과를 산출하는 이유를 설명해 줄 수 있습니까?Nil 대 List (Nil) for for recursion

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

첫 번째 옵션 대

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 
} 

내가 찾고 있어요 결과를 얻을 수 있습니다. 왜 두 번째 옵션이 빈 목록을 반환하는지 이해할 수 없습니다. 나는 다른 결과가 그것에 있다고 생각했을 것이다. 그리고 무엇이든지라면 나는 어떤 종류의 편평한리스트를 얻을 것이고 List[List[String]] (내가 원한다)이다.

답변

1

첫 번째 버전에서 grey0(0)은 빈 목록이 들어있는 1 요소 목록을 반환합니다. grey0(1)grey0(0)의 각 요소에 대해 두 개의 목록을 만들므로 grey0(0)에 하나의 목록이 포함되어 있으므로 총 두 개의 목록을 얻을 수 있습니다. 마찬가지로 grey0(2)grey0(1)의 두 요소 각각에 대해 2 개의 목록을 만들기 때문에 4 개의 목록을 포함하게됩니다.

두 번째 버전에서 grey0(0)은 빈 목록을 반환합니다. grey0(1)grey0(0)에 각 요소에 대해 두 개의 목록을 만듭니다. grey0(0)에는 0 개의 요소가 있으므로 결과적으로 합계는 0*2=0이됩니다.

+0

sepp2k에 감사드립니다. 매우 명확합니다. – JPC

1

첫 번째 예에서는 빈 목록이 포함 된 목록을 만듭니다. 두 번째 예제에서는 빈 목록 만 만듭니다. 모든 목록이 비어있을 수 있기 때문에 두 유형 모두 동일한 유형을 가질 수 있습니다.

Nil은 빈 목록을 의미하며이 값은 List()과 거의 동일합니다 (예제에서는 유형이 유추되어 모두 똑같습니다). List(Nil)List(List())과 같습니다.

관련 문제