代码之家  ›  专栏  ›  技术社区  ›  YOU

这可以称为递归吗?

  •  8
  • YOU  · 技术社区  · 15 年前
    function move() {
    
        pos = pos+1;
    
        t = setTimeout(move, 100); 
    }
    

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

    9 回复  |  直到 10 年前
        1
  •  13
  •   YOU    15 年前

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

        2
  •  3
  •   Ignacio Vazquez-Abrams    15 年前

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

        3
  •  3
  •   Brian Campbell Dennis Williamson    15 年前

    它实际上取决于您对递归的定义,但我要说的是,这是在调度一个回调,以迭代方式调用,而不是递归。

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

    任何类型的硬定义和快速定义的问题都是递归可以通过迭代实现,反之亦然。

    例如,这是递归的吗?

    function state1() {
        doSomething();
        return "state2";
    }
    
    function state2() {
        doSomethingElse();
        return "state1";
    }
    
    var state = "state1";
    while (true) {
        if (state == "state1") {
            state = state1();
        } else {
            state = state2();
        }
    }
    

    state1 状态1 每一个都会导致另一个被调用;所以在某种意义上,这是相互递归。它是由一个迭代循环驱动的,所以它也可以被视为迭代。

    在支持尾部调用优化的语言中,两个函数之间递归调用可能会产生相同的效果(事实上,即使在没有尾部调用优化的语言中,您也可以这样做,但您将很快用完堆栈空间):

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

    所以,问题真的变成了,如何区分某个东西是否是递归的?一个函数导致自己再次被调用这一事实是否会使其递归?

        4
  •  2
  •   Kevin McKelvin    15 年前

    所讨论的代码不是递归——因为代码是在外部调用的,而不是作为循环代码路径的一部分返回到同一方法调用。

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

        5
  •  2
  •   naivists    15 年前

    我会称之为一个延迟的inifite循环。

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

        6
  •  1
  •   user59634    15 年前

    所以,这里f1(“move”)是在调用f1(“settimeout”),这反过来又会调用f1。隐马尔可夫模型。。如果F2是回调函数,则这是一个递归。但是,如果F2正在设置一些属性,比如“超时”。这不是递归。

        7
  •  1
  •   Dan Beam    15 年前

    从技术上讲可能是…

    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( );
    }
    
        8
  •  0
  •   Rookie Programmer Aravind    14 年前

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

    直接递归的例子如下:

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

    也有人说……调用自身的函数..

        9
  •  0
  •   octopusgrabbus ufukgun    12 年前

    不,函数不调用自身。如果函数在移动体中调用自己,那么它将是递归的。