Это можно назвать рекурсивным?

function move() {

    pos = pos+1;

    t = setTimeout(move, 100); 
}

Это можно назвать рекурсивным? Если да, Вы могли бы обеспечить какую-либо ссылку?

8
задан Benjamin 20 September 2014 в 12:32
поделиться

9 ответов

Нет, разница между рекурсией (func_a вызывает func_a) или косвенную рекурсию (func_a вызывает func_b colvers func_a) заключается в том, что использование таймера для повторяющихся вызовов (развязка) не выращивает стек и предыдущее состояние потеряно.

13
ответ дан 5 December 2019 в 06:37
поделиться

Я бы назвал его инфидной петлей с задержкой.

Когда функция возвращается, она не возвращается в предыдущий экземпляр вызова, поэтому нет глубокого «стека вызовов», как правило, находится в рекурсиях.

2
ответ дан 5 December 2019 в 06:37
поделиться

Нет. Функция называется внешним источником (таймером), поэтому он не рекурсивен.

3
ответ дан 5 December 2019 в 06:37
поделиться

Итак, здесь F1 («Move») вызывает F2 («Settimeout»), который в свою очередь, снова вызовет F1. Хм. Это рекурсион, если F2 является функцией обратного вызова. Но, если F2 устанавливает некоторое свойство, как «тайм-аут». Это не рекурсия.

1
ответ дан 5 December 2019 в 06:37
поделиться

Да, это ... Но его можно назвать как косвенную рекурсию ..

Пример для прямой рекурсии было бы что-то вроде этого:

    function factorial (n)
  {
        if(n==0)
   { 
        return(1);
   }

     return (n * factorial (n-1) ); 
  }

Точно так же, как другие сказали .. Функция, называющая себя ..

0
ответ дан 5 December 2019 в 06:37
поделиться

Нет, функция не вызывает сама. Было бы рекурсивно, если функция вызывала себя в теле движения.

0
ответ дан 5 December 2019 в 06:37
поделиться

Представьте себе это вместо этого:

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();
}

Итак, вопрос действительно становится, как вы отличаете ли что-то рекурсивное? Делает ли тот факт, что одна функция вызывает его снова вызвать сделать его рекурсивным?

3
ответ дан 5 December 2019 в 06:37
поделиться

Код, о котором идет речь, не является рекурсивным - так как код вызывается извне, а не как часть циклического кода-пути обратно к тому же самому вызову метода.

В Википедии есть отличная страница о рекурсии: Википедия: Рекурсия (компьютерная наука)

2
ответ дан 5 December 2019 в 06:37
поделиться

Технически это может быть ...

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( );
}
1
ответ дан 5 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: