这可以称为递归吗?

时间:2010-01-13 07:04:32

标签: javascript recursion

function move() {

    pos = pos+1;

    t = setTimeout(move, 100); 
}

这可以称为递归吗?如果是,您能提供任何参考吗?

9 个答案:

答案 0 :(得分:13)

不,递归(func_a调用func_a)或间接递归(func_a调用func_b调用func_a)之间的区别在于使用定时器进行重复调用将(解耦)不会增加堆栈并且之前的状态会丢失。

答案 1 :(得分:3)

没有。该函数由外部源(计时器)调用,因此它不是递归的。

答案 2 :(得分:3)

这实际上取决于你对递归的定义,但我会说这是调度回调被迭代调用,而不是递归。

递归涉及将问题分解为更小的类似问题,直到达到基本情况,然后可能将这些问题的结果合并到解决方案中。这里没有“小”的问题;它只是安排在一段时间后再次发生相同的回调。

任何类型的硬性和快速定义的问题在于递归可以在迭代方面实现,反之亦然。

例如,这是递归吗?

function state1() {
    doSomething();
    return "state2";
}

function state2() {
    doSomethingElse();
    return "state1";
}

var state = "state1";
while (true) {
    if (state == "state1") {
        state = state1();
    } else {
        state = state2();
    }
}

state1state1各导致另一个被调用;所以从某种意义上说,这是相互递归。它由迭代循环驱动,因此它也可以被认为是迭代。

在支持尾调用优化的语言中,两个函数以递归方式相互调用可以产生相同的效果(事实上,即使在没有尾调用优化的语言中,你也可以这样做,但是你会运行它堆栈空间非常快):

function state1() {
    doSomething();
    state2();
}

function state2() {
    doSomething();
    state1();
}

所以,问题确实变成了,你如何区分某些东西是否递归?一个函数是否会再次调用自身这一事实是否会使其递归?

答案 3 :(得分:2)

有问题的代码不是递归 - 因为代码是在外部调用的,而不是作为循环代码路径的一部分返回到相同的方法调用。

维基百科有一个很棒的关于递归的页面:Wikipedia: Recursion (computer science)

答案 4 :(得分:2)

我称之为延迟的inifite循环。

当函数返回时,它不会返回到它自己的先前调用实例,因此没有深度“调用堆栈”,因为它通常是递归。

答案 5 :(得分:1)

所以,这里f1(“move”)调用f2(“setTimeout”),后者又调用f1。嗯..如果f2是一个回调函数,这是一个递归。但是,如果f2设置了一些属性,比如“超时”。这不是递归。

答案 6 :(得分:1)

技术上可能是......

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

答案 7 :(得分:0)

不,该功能不会自行调用。如果函数在移动体内调用自身,那将是递归的。

答案 8 :(得分:0)

是的它是..但它可以被称为间接递归..

直接递归的例子是这样的:

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

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

同样其他人说...函数调用自己..