function move() {
pos = pos+1;
t = setTimeout(move, 100);
}
Это можно назвать рекурсивным? Если да, Вы могли бы обеспечить какую-либо ссылку?
Нет, разница между рекурсией (func_a вызывает func_a) или косвенную рекурсию (func_a вызывает func_b colvers func_a) заключается в том, что использование таймера для повторяющихся вызовов (развязка) не выращивает стек и предыдущее состояние потеряно.
Я бы назвал его инфидной петлей с задержкой.
Когда функция возвращается, она не возвращается в предыдущий экземпляр вызова, поэтому нет глубокого «стека вызовов», как правило, находится в рекурсиях.
Нет. Функция называется внешним источником (таймером), поэтому он не рекурсивен.
Итак, здесь F1 («Move») вызывает F2 («Settimeout»), который в свою очередь, снова вызовет F1. Хм. Это рекурсион, если F2 является функцией обратного вызова. Но, если F2 устанавливает некоторое свойство, как «тайм-аут». Это не рекурсия.
Да, это ... Но его можно назвать как косвенную рекурсию ..
Пример для прямой рекурсии было бы что-то вроде этого:
function factorial (n)
{
if(n==0)
{
return(1);
}
return (n * factorial (n-1) );
}
Точно так же, как другие сказали .. Функция, называющая себя ..
Нет, функция не вызывает сама. Было бы рекурсивно, если функция вызывала себя в теле движения.
Представьте себе это вместо этого:
A = True
B = False
print A # true
A = B; print A # false
A = A; print A # false, because A is still false from before
A = not A; print A # true, because A was false, so not A is true
Точно так же продолжается, но в вашей версии он сбивает с толку, потому что вы не ожидаете, что вы можете переопределить истинные и ложные.
-121--2065690-Это действительно зависит от вашего определения рекурсивных, но я бы сказал, что это планирует обратный вызов, который будет называться итеративно, а не рекурсию.
Рекурсия включает в себя нарушение проблемы вниз на меньшее, аналогичные проблемы, пока вы не достигнете базового случая, а затем, возможно, сочетая результаты из тех в раствор. Здесь нет проблем «меньше»; Это просто планирование того же обратного обратного вызова, чтобы повторить после определенного времени.
Проблема с любым жестким и быстрым определением заключается в том, что рекурсия может быть реализована с точки зрения итерации и наоборот.
Например, это рекурсивный?
function state1() {
doSomething();
return "state2";
}
function state2() {
doSomethingElse();
return "state1";
}
var state = "state1";
while (true) {
if (state == "state1") {
state = state1();
} else {
state = state2();
}
}
State1
и ) и
Каждый заставляет друг друга вызвать; Так что в одном смысле это взаимная рекурсия. Хотя он приводится в движение итеративной петлей, поэтому его также можно считать итерацией.
На языке, который поддерживает оптимизацию Call-Call, тот же эффект может быть иметь два функция рекурсивно, вызывающих друг друга (на самом деле даже на языке без оптимизации Call-Call, вы могли бы сделать это Вышло из стека пространства очень быстро):
function state1() {
doSomething();
state2();
}
function state2() {
doSomething();
state1();
}
Итак, вопрос действительно становится, как вы отличаете ли что-то рекурсивное? Делает ли тот факт, что одна функция вызывает его снова вызвать сделать его рекурсивным?
Код, о котором идет речь, не является рекурсивным - так как код вызывается извне, а не как часть циклического кода-пути обратно к тому же самому вызову метода.
В Википедии есть отличная страница о рекурсии: Википедия: Рекурсия (компьютерная наука)
Технически это может быть ...
function move() {
var $this = this;
pos = pos+1;
t = setTimeout($this, 100);
}
Но я не вижу причин, почему вы хотите сделать это. И если вы действительно хочется глупо (и заблокировать нить браузера):
function move() {
var now = +new Date;
pos = pos+1;
while( ( +new Date - now ) <= 100 ){ }
move( );
}