2012-01-13 2 views
2

저는 자바 스크립트를 처음 접했고 친구를위한 특별한 교대 스케줄 코드를 작성하려고했습니다. 가 현재 작동하는 방법은 다음과 같다 : 트리 워킹을위한 재귀를 피할 수있는 최적의 방법

function walk(currentDay) { 
    var today = allWorkDays[currentDay]; // An array of all workdays we need to schedule 
    var vertices = fetchCombinationsForToday(today); // Fetch an array of 0 length or more 
               // containing possibilities for the day 
               // according to rules set by user 
    for (var i=0; i<vertices.length; i++) { 
     [we add the vertices[i] to a running array] 
     walk(currentDay+1); 
    } 
    if (currentDay == sumOfAllDays) { // We are at a leaf 
      analyzeSchedule(); // This will keep a copy of the current schedule 
           // if it has a higher score than X 
    } 
    [some business to pop the last node/day we added to our global array] 
} 

지금 코멘트에 지정된 규칙은 일반적으로 지난 5-10 마지막으로 추가 된 요소 (일)을 분석하고 오늘의 변화가 될 수있는 것을 돌려 규칙입니다.

내가 여기에있는 문제는 프로그램이 1000 일 이상의 배열에도 일정을 찾아 낼 수 있도록하려는 것이지만 재귀 때문에 함수 호출 제한을 초과합니다. 자바 스크립트에서 재귀를 사용하지 않고 트리를 걷는 방법이 있습니까? 대부분의 경우 재귀에 의해 해결할 수있는 문제는 루프에 의해 해결 될 수 있으며 반대의 경우에도 반복 문제로 해결할 수있는 문제가 있음을 알 수는 있습니다.

트리의 초기에는 정점 배열이 큼 (20-30 개 요소)이지만 빠르게 작아집니다 (0-5 요소). 나는이 코드를 결코 실행하지 않았다. [EDIT : "도달 한 함수 호출 한도"오류] 모든 이론이긴하지만 [편집 : 사실은 내가 도달 할 것이다].

+1

코드를 실행하고 디버깅하고 코드를 다시 작성하고 구조를 작성하여 생각해보십시오. 진지하게 코드를 실행해야합니다. 의사 코드는 좋지만 해결책을 찾지 못할 것이며 우리는 해결책을 제공하지 않을 것입니다. –

+0

@ EvilP i concur, 그리고 나는 또한 TDD를 사용하는 초기의 소리처럼이 소리를 추가 할 것입니다. 당신은 모든 것을 설명하고 행동을 검증하기를 원합니다. 선택한 js 단위 테스트 프레임 워크를 선택하고 코딩을 시작하십시오. 좀 더 구체적인 implentation 문제가 발생하면 그 질문을 할 수도 있습니다. –

+1

미안하지만, 의사 코드는 나에게 (그리고 다른 사람들이) 대안을 제안하기에 충분할 정도로 문제를 이해하기 위해 당신이하려는 일에 대한 설명으로는 충분하지 않습니다. – jfriend00

답변

1

JavaScript Arrays은 시작과 끝의 값을 푸시/팝 및 시프트/푸는 방법을 제공하므로 큐와 같이 사용할 수 있습니다. 예를 들어 당신이 트리 구조를 걸어 노드의 트랙을 유지할 수

var a = [0, 1, 2]; 
a.push(3); // => 3 
a; // [0, 1, 2, 3] 
a.shift(); // => 0 
a; // [1, 2, 3] 
a.pop(); // => 3 
a; // [1, 2] 

이런 식으로 배열에서 unshifting/밀고 터지는에 의해이-방문한다.

+0

다른 정점을 추적하기 위해 클로저를 사용하는 대신에 (배열의) 배열을 사용할 것입니다. ie VerticesAtLevel [0] = [x, y, z] 여기에서 x, y, z는 가능한 버텍스이고, 버텍스> 0의 한, 나는 트리에있는 어떤 레벨의 카운터를 유지할 수 있으며, 내가 현재있는 경로의 배열을 유지하십시오. 그래서 currentPath.push (VerticesAtLevel [currentLevel] [0]) 그런 다음 VerticesAtLevel [currentLevel] .shift(); 뒤이어 currentLevel ++; 나는 이미 경로를 추적하고 있었기 때문에 결코 정점을 추적하지 않을 것이라고 생각합니다 ... – joual

관련 문제