Рекурсия может быть запутанным, если вы не имели дела с ним, но я попытаюсь объяснить:
Вы звоните: f(3)
Так оно входит и призывает: document.write("<p style='background: blue'>" + counter);
который печатает затем синяя линия с 2 в качестве счетчика 2 после counter--
, то он вызывает f(2)
(потому что counter != 0
, как это 2.)
так называет: document.write("<p style='background: blue'>" + counter);
, который печатает тогда синюю линию с 1 в качестве счетчика 1 после counter--
, тогда он называет f(1)
(потому что counter != 0
как есть 1.)
Так она называет: document.write("<p style='background: blue'>" + counter);
который печатает затем синюю линию с 0, как счетчик 0 после counter--
, то это не вызывает f(0)
(потому что counter == 0
)
так что теперь мы завершаем функция мы в (где «счетчик == 0»), и она вызывает: document.write("<p style='background: yellow'>" + counter);
, который печатает затем желтую линию с 0, как счетчик равен 0
, то мы вернемся к функции были мы назвали f(0)
от и counter == 1
и что вызывает document.write("<p style='background: yellow'>" + counter);
который печатает затем желтая линия с 1, как счетчик 1
тогда мы вернемся к функции были мы назвали f(1)
от и counter == 2
и что вызывает document.write("<p style='background: yellow'>" + counter);
который печатает затем желтая линия с 2, а счетчик 2
Я знаю, что это сбивает с толку, но я надеюсь, что это помогает?
* EDIT * Вот мой более подробный и, надеюсь, очень четкое объяснение!
Вот моя попытка:
function f(3) {
counter--;
document.write("<p style='background: blue'>" + counter);
if(counter != 0) {
f(counter) // counter equals 2
}
document.write("<p style='background: yellow'>" + counter);
}
Так позволяет просто заменить f(counter)
ака f(2)
выше с тем, что фактически называется (размещение счетчика ж/Counter2, потому что они являются отдельными переменными:
function f(3) {
counter--;
document.write("<p style='background: blue'>" + counter);
if(counter != 0) {
counter2 = counter;
counter2--;
document.write("<p style='background: blue'>" + counter2);
if(counter2 != 0) {
f(counter2) // counter2 equals 1
}
document.write("<p style='background: yellow'>" + counter2);
}
}
document.write("<p style='background: yellow'>" + counter);
}
сейчас снова, просто замените f(counter2)
aka f(1)
выше на то, что на самом деле называется (заменяя counter2 w/counter3, поскольку они снова являются отдельными переменными.)
function f(3) {
counter--;
document.write("<p style='background: blue'>" + counter); // prints 2
if(counter != 0) {
counter2 = counter;
counter2--;
document.write("<p style='background: blue'>" + counter2); // prints 1
if(counter2 != 0) {
counter3 = counter2;
counter3--;
document.write("<p style='background: blue'>" + counter3); // prints 0
if(counter3 != 0) { // counter3 equals 0 so this is false
f(counter3); // this is never called because counter3 DOES equal 0
}
document.write("<p style='background: yellow'>" + counter3); // prints 0
}
document.write("<p style='background: yellow'>" + counter2); // prints 1
}
}
document.write("<p style='background: yellow'>" + counter); // prints 2
}
почему все не-любовь? – jAndy
Продвинутые пользователи иногда забывают, что рекурсия может быть трудной для новичков. –