2011-06-12 3 views
2

재귀 검색은 주로 중첩 된 개체/데이터를 검색하는 데 사용됩니다. 객체 중 일부가 서로를 참조하면 무한 루프가 될 수 있습니다. 그렇다면 컴퓨터를 손상시키지 않고 지정된 매개 변수를 건너 뛰지 않고 모든 항목을 검사하는 가장 효과적인 방법은 무엇입니까? 여기 반복되지 않고 AS3 반복 객체 스캔?

는 다음가에서 서로에 대한 스캔을 트리거

//... 
obj1.next = obj2; 
//... 
obj2.next = obj3; 
//... 
obj3.next = obj1; 
//... 
recursiveScanner(obj1, scanFuction); 

개체에 전달 될 때

/** 
* Triggers the scan function for each object given 
**/ 
function recursiveScanner(object:* , scanFunction:Function):void { 
    if(typeof(object) == 'object') { 
     for(var key:String in object) { 
      recursiveScanner(object[key], scanFunction); 
     } 
    } else { 
     scanFunction.call(this, object); 
    } 
} 

그러나 큰 문제가 발생 ... 재귀 스캐너의 예 영원한 고리. 그래서 이것을 해결할 수있는 방법이 있습니까?

나는 C/C++를 믿는다 : 각 scanFunction 호출은 스캔 한 '메모리 주소'로 구성된 목록에 추가되어 반복을 방지한다. 이것은 AS3에서도 가능합니까? 더 우아한 방법이 있습니까?

답변

10

는 사용 검사 개체의 목록을 유지하고 그들이 전에 스캔 한 경우 그들을 무시하는 Dictionary : 여기

/** 
* Triggers the scan function for each object given 
**/ 
function recursiveScanner(object:* , scanFunction:Function, ignoreList:Dictonary = null):void { 
    // if we have no list, create one 
    if (!ignoreList) ignoreList = new Dictionary(); 

    // if the item is in the list, we bail 
    if (ignoreList[object]) return; 

    // mark the item as scanned before recursing into it 
    ignoreList[object] = true; 

    if(typeof(object) == 'object') { 
     for(var key:String in object) { 
      recursiveScanner(object[key], scanFunction, ignoreList); 
     } 
    } else { 
     scanFunction.call(this, object); 
    } 
} 
+0

Ahh ... 개체 ID가 사전에 특성으로 사용됩니다. 솔루션의 Thx =) – PicoCreator

2

OK, @grapefrukt에서 답을 받아,하지만 몇 가지 배경입니다.

컴퓨터 과학 용어에서 문제는 사이클을 포함 할 수있는 directed graph을 통과하는 것과 같습니다.

본질적으로 두 가지 순회 법 (추론을 따르지 않음)이 통과하는 경우는 depth first 또는 breadth first입니다.

예제 코드가 BFS인지 DFS인지 확인하는 연습으로 남겨 두겠습니다.

+0

깊이 우선 :) 먼저 읽어야 할 것처럼 너비가 가장 큰 내 배포에 가장 적합합니다. 내 배포에 반복이없는 모든 노드. 그래서 BFS에서 FIFO를 갖는 것은 불필요한 비용입니다. 어쨌든 좋은 읽기 및 참조를위한 Thx =)는이 전에 BFS를 알지 못했습니다. :) 앞으로 유용 할 것입니다. TY – PicoCreator