사이에 조정하기 :패턴은 하노이 타워 문제에 대한이 고전 재귀 의사 솔루션을 고려 재귀 알고리즘과 이벤트 중심의 소비자
void move(num,src,dest,spare) {
if(num == 1) {
moveSingle(src,dest);
} else {
move(num-1,src,spare,dest);
move(1,src,dest,spare);
move(num-1,spare,dest,src);
}
}
을 ... 그리고 디스플레이 엔진 등의 이벤트 루프를 고려 처리
void draw() {
// code to draw a single frame goes here; for example
if(! aDiscIsInMotion()) {
getNextMove();
}
updateCoordinates();
drawMovingDisc();
}
두 패턴간에 어떤 좌표가 있습니까?
두 가지 옵션이 마음에 와서 :
스레드와 큐
을 자체 스레드에서 재귀 함수를 시작. moveSingle()는 FIFO 큐로 이동을 기록합니다. 대기열의 용량이 초과되면 차단 될 수 있습니다. getNextMove()는 큐에서 이동을 읽습니다.
나는 이것이 잘 동작 할 것이라고 확신하지만, 스레딩을 피하는 패턴이 있는지 궁금합니다.
대신 오히려 호출 스택보다는 힙에 LIFO 큐를 사용하도록 재귀 알고리즘을 다시 작성
를 재귀의 명시 적 스택을 사용합니다. 예 :
Move getMove() {
if(lifo.isEmpty()) {
return null;
}
State state = lifo.pop();
while(state.num != 1) {
lifo.push(new State(state.num -1, state.spare, state.dest, state.src));
lifo.push(new State(1, state.src, state.dest, state.spare));
lifo.push(new State(state.num -1, state.src, state.spare, state.dest));
state = lifo.pop();
}
return new Move(state); // guaranteed num==1
}
... 다시 작동하지만 상태를 보존하기 위해 호출 스택을 사용하여 표현력을 상실합니다.
내가 찾지 못한 또 다른 기술이 있습니까?
하노이 타워와 처리의 예를 선택 했음에도 불구하고 이것은 재귀 알고리즘을 업데이트를 위해 폴링하려는 다른 인터페이스와 통합하는 일반적인 문제로 고안되었습니다. 그래서 저는 "하노이를 해결하기 위해 스택이 필요 없습니다"와 같은 대답에 관심이 없습니다. - 저도 압니다.
매우 흥미로운 내용입니다. 나는 루아가 각기 coroutines ("fibres")에 그들 자신의 "작은 4k"스택을 제공한다고 언급한다. – slim