2012-12-09 1 views
1

이것은 숙제를위한 것입니다. 숙제는 나무 구조에 재귀가 아닙니다. 나는 거의 과제를 마쳤지 만, 나무를 위로 옮기는 재귀 적 방법이 나 빠진다. 트리 구조는 아래의 클래스에 의해 주어진다 :for 루프 반환 문이 포함 된 재귀 메서드

package lab12; 

import java.io.Serializable; 

public class Dog implements Serializable{ 

    public Dog[] children; 
    public String name; 

    public Dog(String name) 
    { 
     this.name = name; 
    } 

    @Override 
    public String toString() 
    { 
     return name; 
    } 

} 

나는 return null이 확실하다. 내 for 루프와 결합 된 문. for 루프는 자식을 포함하지 않고 결과로 null을 반환하는 노드를 반복합니다. 이 메서드를 끝내고 null 포인터 예외를 제공하는 내 프로그램에 null을 전달합니다.

return 문을 제거 할 수 없거나 for 루프를 사용하여 100 % 반환하더라도 컴파일되지 않습니다.

public Dog findParent(Dog root, String name) 
{ 
    String top = "Spot"; 
    if(top.equals(name)) 
    { 
     System.out.println("No further records"); 
     System.out.println("Goodbye."); 
     System.exit(0); 
    } 
    for(int i = 0; root.children != null && i < root.children.length; i++) 
    { 
     if(root.children[i].name.equals(name)) 
     { 
      return root; 
     } 
     else 
     { 
      return findParent(root.children[i], name); 
     } 
    } 
    return null; //Compiler still requires a return here. 
} 

비공 인 재귀 적 방법에서 for 루프를 사용할 때 공통적 인 문제라고 생각합니다. 컴파일러를 행복하게 만들 수있는 방법이 있습니까? 아직 Null 문을 반환하지 않았습니까?

+0

게시 할 때 문제가 있는지 확인하십시오. StackOverflow는 코드를 디버깅하지 않습니다. –

답변

3

코드가 작동해서는 안됩니다. if 및 else 절이 모두 반환되기 때문입니다. 따라서 루프는 인덱스 0 만 수행합니다.

public Dog findParent(Dog root, String name) 
{ 
    String top = "Spot"; 
    if(top.equals(name)) 
    { 
     System.out.println("No further records"); 
     System.out.println("Goodbye."); 
     System.exit(0); 
    } 
    for(int i = 0; root.children != null && i < root.children.length; i++) 
    { 
     if(root.children[i].name.equals(name)) 
     { 
      return root; 
     } 
     else 
     { 
      Dog parent = findParent(root.children[i], name); 
      if (parent != null) 
       return parent; 
     } 
    } 
    return null; 
} 

이제 "return null"이 필요합니다.

대부분의 경우 컴파일러는 똑똑합니다. 경고 메시지가 표시되면 경고를 피하기 위해 컴파일러를 속여 쓰는 대신 코드의 오류를 고려해야합니다.

+0

이것은 깨지지 않지만 부모를 찾지 못합니다. 저는 root.children [i]을 사용하여 현재 노드의 자식을 조사하고 부모 노드를 찾으려고하는 노드의 이름과 동일한 지 확인합니다. root.name.equals (name)를 사용하면 노드 이름이 부모를 찾으려는 노드의 이름과 같은 위치를 찾을 수 있습니다. 나무를 내려다 보면 멀리까지 이동할 수 없습니다. – sage88

+0

컴퓨터에서 내 코드를 사용해 보셨습니까? 재귀 적으로 검색하는 올바른 방법을 보여주었습니다. – TieDad

+0

예 코드를 사용해 보았습니다. 불행히도 부모 노드를 찾으려고하는 동일한 노드에 노드를 설정합니다. 당신이 그것을 실행하면 당신은 같은 노드를 반복해서 얻는다. – sage88

2

이 문제를 완전히 이해하지 못하면 "return null"문을 실행하지 않아도됩니다. 아마 당신은 다른 문은 다음과 같아야합니다

return findParent(root.children[i], name); 

이 반환은 "부모가"발견되면 그 값이 반환 될 수 있도록 할 것이다.

+1

for 루프의 컨텍스트에서 어떻게 수행합니까? 위 코드를 편집하여 findParent (root.children [i], name)를 반환했습니다. 내 else 문을 없애 버렸으므로 지금은 for 루프 일뿐입니다. 컴파일러는 여전히 추가 반환 null 문을 끝에 필요합니다. – sage88