繁体   English   中英

javascript中的递归限制如何?

[英]how restricted is recursion in javascript?

我想它可以阻止浏览器一直被Duff代码所困扰,但这是:

        function print(item) {
            document.getElementById('output').innerHTML = 
               document.getElementById('output').innerHTML
               + item + '<br />';
        }

        function recur(myInt) {
            print(myInt);
            if (int < 10) {
                for (i = 0; i <= 1; i++) {
                    recur(myInt+1);
                }
            }
        }

产生:

0
1
2
3
4
5
6
7
8
9
10
10

而不是我做这些事时得到的旧烂摊子:

        function recur(myInt) {
            print(myInt);
            if (int < 10) {
                for (i = 0; i <= 1; i++) {
                    var x = myInt + 1;
                    setTimeout("recur("+x+")");
                }
            }
        }

我是否缺少某些东西,或者这是您在JS中进行递归的方式? 我对使用递归导航树感兴趣,您需要为每个孩子调用该方法。

您正在使用全局变量作为循环计数器,这就是为什么它只为最内层调用完全循环。 当您从该调用返回时,对于所有其他循环,该计数器已经超出了循环结束。

如果您创建局部变量:

function recur(int) {
    print(int);
    if (int < 10) {
        for (var i = 0; i <= 1; i++) {
            recur(int + 1);
        }
    }
}

输出与使用超时时的项目数相同。 使用超时时,全局变量不会引起相同的问题,因为当您退出循环时,递归调用将排队并在以后执行。

我知道你在做什么 函数中的递归保持一定范围,因此每次循环运行一次时,迭代器(i)实际上在每个范围中都会增加。

function recur(int) {
            print(int);
            if (int < 10) {
                for (var i = 0; i <= 1; i++) {
                    recur(int+1);
                }
            }
        }

请注意,现在它是“ var i = 0”,这将阻止您的迭代器相互覆盖对方。 设置超时时,它允许第一个循环在运行其余循环之前完成运行,它也将在window对象之外运行,这可能会删除最后一个迭代器的关闭。

递归在JavaScript中几乎没有限制。 除非您的树木很深,否则应该没问题。 大多数树,即使具有数百万个元素,都相当宽,因此您最多可以在堆栈上进行log(n)递归调用,这在正常情况下不是问题。 当然不需要setTimeout 就像在第一个示例中一样,您有时会需要保护子句以确保递归达到最低要求,这是对的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM