2016-08-12 1 views
-1

아래의 방법을 구현하는 방법을 파악하는 데 문제가 있습니다. 깊이 우선 검색을 사용하여 트리에 값이 있는지 확인하려고하지만 구현에서 무엇이 잘못되었는지는 확실하지 않습니다. 나는이 작업을 수행 할 때최대 호출 스택 크기를 초과했습니다. 논리가 잘못된 부분을 파악할 수 없습니다.

class Tree { 
    constructor(val) { 
    this.value = val; 
    this.children = []; 
    } 

    addChild(val) { 
    this.children.push(new Tree(val)); 
    } 

    contains(val) { 
    if (this.value === val) { 
     return true; 
    } else if (this.children.length > 0) { 
     for (var i = 0; i < this.children.length; i++) { 
     this.contains(this.children[i].contains(value)); 
     } 
     // When it gets to the leaf node, how do I go back to the previous call? 
     // Do I need to return something here? 
    } 

    return false; // I may be incorrect on this, but it should return false (execute this line) only when every node has been visited, and there are no more nodes to check. 
    } 
}; 

그래서 :

const T = new Tree(100); 
T.addChild(50); 
T.addChild(40); 
T.children[0].addChild(3); 

console.log(T.contains(40)); 

나는 때문에 최대 호출 스택 오류 부족 오류.

+1

'contains()'를 실제로'contains()'안에있는 루프 내에서'contains() '를 호출하는 것으로 추측하고 있습니다. 가난한 브라우저에서는 너무 많이됩니다. – adeneo

답변

3

이 줄 : contains 부울을 반환해야합니다, 그것은 트리가 부울 값이 포함 된 경우 다시 확인하는 의미가 없기 때문에

this.contains(this.children[i].contains(value)); 

는 의문이다. 또한 문제는 다음과 같습니다. contains을 동일한 인수 (인수로 this 포함)로 호출하고 있습니다. 즉, "최대 호출 스택 크기 초과"오류 (스택 오버 플로우라고도 함)가 발생하지 않을 것임을 의미합니다. .

대신에, 당신이 그것을 변경해야합니다 :

if (this.children[i].contains(value)) 
    return true; 

그런 식으로,이 값을 찾아 처음으로, 그것은 반환합니다. 재귀는 기본 사례가이므로 this.children의 값을 찾거나 루프의 끝에서 벗어나기 때문에 예상대로 작동합니다.

+0

@rvignhne 당신이 의미하는 바를 설명 할 수 있습니까? 또한 문제는 이 라인에서 : 당신은 똑같은 인수를 (그것을 인자로 생각한) 자체 안에 포함하고 있습니다. 즉, 결코 멈추지 않을 것이고, "최대 호출 스택 크기를 초과했습니다"라는 오류가 발생합니다 - 스택 오버플로가 발생합니다. " – AlanH

+0

@AlanH'this'에'contains'를 호출 했으므로 의도 한대로 트리의 다음 단계를 확인하지 않고 있습니다. 대신, 트리의 동일한 레벨을 부울 값 (두 번째 포함 호출에서 반환 됨)으로 확인하고 있습니다. 'children'이 boolean을 포함하지 않는다면,'contains'는 결코 하나를 찾지 않을 것입니다 -하지만, 무한한 복사본을 생성 할 것입니다, 각각은 그것을 찾으려고합니다, 결국 스택 오버 플로우가 발생합니다. [이 질문] (http://stackoverflow.com/questions/717725/understanding-recursion) 재귀 좋은 예가 있습니다. – rvighne

관련 문제