function move() {
pos = pos+1;
t = setTimeout(move, 100);
}
这可以称为递归吗?如果是,您能提供任何参考吗?
答案 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();
}
}
state1
和state1
各导致另一个被调用;所以从某种意义上说,这是相互递归。它由迭代循环驱动,因此它也可以被认为是迭代。
在支持尾调用优化的语言中,两个函数以递归方式相互调用可以产生相同的效果(事实上,即使在没有尾调用优化的语言中,你也可以这样做,但是你会运行它堆栈空间非常快):
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) );
}
同样其他人说...函数调用自己..