Это действительно зависит от вашего определения рекурсии, но я бы сказал, что это планирование обратного вызова, вызываемого итеративно, а не рекурсии.
Рекурсия включает разбиение проблемы на более мелкие, похожие проблемы, пока вы не достигнете базового случая, а затем, возможно, объединение полученных результатов в решение. Здесь нет «меньшей» проблемы; это просто планирование того же самого обратного вызова, чтобы повториться через определенное время.
Проблема любого вида жесткого и быстрого определения заключается в том, что рекурсия может быть реализована в терминах итерации, и наоборот.
Например, это рекурсивно?
function state1() {
doSomething();
return "state2";
}
function state2() {
doSomethingElse();
return "state1";
}
var state = "state1";
while (true) {
if (state == "state1") {
state = state1();
} else {
state = state2();
}
}
state1
и state1
каждый вызывает другого; так что в каком-то смысле это взаимная рекурсия. Он управляется итеративным циклом, поэтому его также можно считать итерацией.
В языке, который поддерживает оптимизацию хвостового вызова, тот же эффект может быть получен двумя рекурсивно вызывающими друг друга функциями (фактически, даже в языке без оптимизации хвостового вызова вы можете сделать это, но вы должны выполнить очень быстро выходит из стека):
function state1() {
doSomething();
state2();
}
function state2() {
doSomething();
state1();
}
Итак, действительно возникает вопрос: как вы различаете, является ли что-то рекурсивным? Делает ли тот факт, что одна функция вызывает себя снова, делает ее рекурсивной?