2012-01-13 2 views
1

나는 어리석은 실수를 저지르고 있다고 확신합니다. 그러나 그것은 저를 상대로합니다. 이 날이 오류를 제공 컴파일재귀. 모든 코드 경로가 값을 반환하지는 않습니다.

void Main() 
{ 
    //Key is a parent while the list contains its children 
    Dictionary<string,List<string>> d = new Dictionary<string,List<string>>(); 
    d.Add("1",new List<string>(){"2","3"});//valid.should return false 
    d.Add("2",new List<string>(){"4"});//valid.should return false 
    d.Add("3",new List<string>(){"5"});//valid.should return false 
    d.Add("4",new List<string>(){"1"});//invalid.should return true 

    IsChildAlreadyAParent("4","2",d); 
} 

private bool IsChildAlreadyAParent(string child, string parent, Dictionary<string, List<string>> d) 
{   
    if(!d.ContainsKey(child) || (d.ContainsKey(child) && d[child].Count == 0)) 
    { 
     return false; 
    } 

    foreach(string childOfChild in d[child]) 
    { 
     if(childOfChild == parent) 
      return true; 

     if(IsChildAlreadyAParent(childOfChild, parent, d)) return true; 
    } 
} 

: 내가 코드를 몇 번 읽고 내가 복귀 조건이 놓친 것이 얼마나 볼 수 없습니다

IsChildAlreadyAParent(string, string, System.Collections.Generic.Dictionary<string,System.Collections.Generic.List<string>>)' : not all code paths return a value

여기에 코드 조각이다. 메서드 끝 전에 메서드 return 문을 추가하여 수정할 수는 있지만이 문제를 즉시 이해할 수는 없습니다. 간격은 어디 있습니까 ??

답변

6

당신이 항상 함수에서 반환 정확히 한 번만 루프 본문을 실행 생각할 수 있습니다 :

foreach(string childOfChild in d[child]) 
{ 
    if(childOfChild == parent) 
     return true; 

    return IsChildAlreadyAParent(childOfChild, parent, d); 
} 

그러나 d[child] 경우가 전혀 요소가 없다?

또한 첫 번째 자식 만 테스트하는 것이 적절한 해결책이 아닐 수도 있습니다.

더 나은 :

foreach(string childOfChild in d[child]) 
{ 
    if(childOfChild == parent) return true; 
    if (IsChildAlreadyAParent(childOfChild, parent, d)) return true; 
} 
return false; 
+0

의 부부와 함께 코드입니다 여기에 ... – umbersar

+0

하지만 제기 된 요점은 "첫 번째 자식 만 테스트하는 것이 옳은 해결책이 아닐 수도 있습니다"라고 도움이되었습니다 – umbersar

+2

@wanderer : 죄송합니다. 컴파일러는 이미 빈 목록을 테스트했습니다. 따라서 여전히 루프 아래에서 일어나는 일과 관련이 있습니다. –

0

무엇 d[child] 경우는 0의 길이가? 따라서 for 루프는 실행되지 않습니다. -> 반환 값이 없습니다.

0

코드가 "foreach"에 들어 가지 않을 수도 있습니다 ... 결국 반환해야합니다 ... d [child]가 ' 요소가 전혀 없습니다 ...

+0

또한 처리 할 코드를 수정했습니다. – umbersar

0

글쎄, 만약 당신의 목록이 비어 있다면?

foreach 루프는 아무 의미가 없습니다. 첫 번째 반복에서 항상 종료됩니다.

+0

도이 코드를 처리하기위한 코드가 수정되었습니다. – umbersar

2

d[child] 컬렉션이 비어있는 경우 루프 본문이 실행되지 않으므로 컴파일러는 불평합니다. 특정 코드 경로에 return이 없으므로 오류가 발생합니다.

또한 성공적으로 실행되면 사전에 코드의 이 3 번 조회됩니다. TryGetValue으로 한 번의 조회 만 수행하도록 최적화 할 수 있습니다. 여기

뿐만 아니라 ... 여전히 같은 문제와 내가 그나마이 유 가지고 끝에 방법 반환을 사용하는 wan't 것을 처리 할 코드를 수정 수정

private bool IsChildAlreadyAParent(
    string child, 
    string parent, 
    Dictionary<string, List<string>> d) 
{   
    List<string> list; 
    if (!d.TryGetValue(child, out list) || list.Count == 0) 
    { 
     return false; 
    } 

    if (list[0] == parent) 
    { 
     return true; 
    } 

    return IsChildAlreadyAParent(list[0], parent, d); 
} 
+0

안녕하세요 jaredpar .. 코드가 컴파일되지 않습니다. – umbersar

+0

@wanderer 내 잘못, 오타가 수정되었습니다. 지금 – JaredPar

+0

을 컴파일해야하지만 첫 번째 자식 만 확인합니다. 목록 [0] .... – umbersar

관련 문제