В вашем последнем блоке кода рекурсивная функция выполняется рекурсивно, создает все тайм-ауты, и через 2 секунды все тайм-ауты перезваниваются вскоре после другого, поэтому она мигает ( в подробном объяснении ).Вместо этого вы также хотите отложить рекурсивный вызов:
function hanoi(n, from, to, help){
if (n == 1){
setTimeout(function(){swap(from, to);}, 2000);
} else{
setTimeout(function() {
hanoi(n-1, from, help, to);
swap(from, to);
hanoi(n-1, help, to, from);
}, 2000);
}
}
Однако, хотя это работает, этот код не очень красив.На самом деле, Ханойский метод не визуализирует и не задерживает цикл.Вместо этого я написал бы логику Ханоя в методе, который может быть прерван, а затем он может быть вызван функцией-обработчиком, которая выполняет рендеринг и задержку.Это идеальный вариант использования для генераторов:
function* hanoi(n, from, to, help){
if (n == 1){
swap(from, to);
} else{
yield* hanoi(n-1, from, help, to);
swap(from, to);
yield* hanoi(n-1, help, to, from);
}
yield; // Pass execution back to the "runStepByStep" loop, rerendering & delaying happens here
}
И обработчик:
const timer = ms => new Promise(resolve => setTimeout(resolve, ms));
async function runStepByStep(iterator) {
let done = false;
do {
({ done } = iterator.next());
rerender(); // TODO: Implement this
await timer(2000);
} while(!done);
}
runStepByStep( hanoi(10, 0, 2, 1) );