Javascript 中的递归函数和深度跟踪

2024-02-10

我正在用 JS 编写一个递归函数,但遇到了一些麻烦。让我们从这个非常基本的函数开始:

function traverse(thing)
{
    if (typeof traverse.depth == 'undefined')
        traverse.depth = 1;
    else
        traverse.depth ++;

    if (thing.child)
        traverse(thing.child);
}

所以这工作正常,并且depth充当某种静态变量,但问题是,在像 C 这样具有适当静态变量的语言中,当您退出函数时,该变量会(表面上)减少,因此它是真正的深度。如果我有三个包含三个盒子的盒子,每个盒子又包含三个盒子,等等,我们实际上是向下钻取最深的一个盒子,直到没有子节点,然后将一个级别备份到兄弟节点,并遍历它的子节点。上面代码的问题在于,深度不断增加并且无限增加,尽管从最古老的祖先到最小的孩子,TRUTH 深度可能只有 3 或 4。如果每个级别有 80 个兄弟姐妹,则深度计数器将会飙升。

如何跟踪 JS 递归函数的真实深度?


不要将计数器附加到函数上。该计数器由所有递归调用共享,因此该计数器代表函数调用次数,而不是递归深度。

When depth作为单独的变量传递,计数器显示真实深度。

function traverse(thing, depth)
{
    if (typeof depth == 'number')
        depth++;
    else
        depth = 1;

    if (thing.child)
        traverse(thing, depth);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 中的递归函数和深度跟踪 的相关文章