Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 嵌套for循环与递归for固定高度树_Javascript_Recursion_Tree_Iteration - Fatal编程技术网

Javascript 嵌套for循环与递归for固定高度树

Javascript 嵌套for循环与递归for固定高度树,javascript,recursion,tree,iteration,Javascript,Recursion,Tree,Iteration,我知道这是计算机科学的基础问题,可能和我的问题相匹配的是 但它并没有涵盖我的webapp中的两个不同场景 我正在处理两个不同的树状对象数组,它们的成员为子对象。 现在 具有固定高度的第一棵树(最多3层) 第二棵树,具有任意深度 这两个树的结构与下面类似(它是一个对象数组,基本上是一个JSON): 0 ---- someKey | ---- someOtherKey | ---- children 0 ---- someKey |

我知道这是计算机科学的基础问题,可能和我的问题相匹配的是

但它并没有涵盖我的webapp中的两个不同场景

我正在处理两个不同的树状对象数组,它们的成员为
子对象。
现在

  • 具有固定高度的第一棵树(最多3层)

  • 第二棵树,具有任意深度

  • 这两个树的结构与下面类似(它是一个对象数组,基本上是一个JSON):

    0 ---- someKey
    |
    ---- someOtherKey
    |
    ---- children
                    0 ---- someKey
                    |
                    ---- someOtherKey
                    |
                    ---- children
                                  0 ---- someKey
                                  |
                                  ---- someOtherKey
                                  |
                                  ---- children []
                    1 ---- someKey
                    |
                    ---- someOtherKey
                    |
                    ---- children []
    
    1 ---- someKey
    |
    ---- someOtherKey
    |
    ---- children []
    
    2 ---- someKey
    |
    ---- someOtherKey
    |
    ---- children []
    
    现在,为了遍历第一棵树,我将使用3个嵌套for循环,而对于第二棵树,我将使用递归访问每个节点直到叶子。到目前为止,我的表现还算不错

    但是在第一种情况下使用递归有什么好处吗?


    对于深度可变的第二棵树,递归哪里有不足之处?

    在第一种情况下,递归比循环更糟糕,其优点和缺点取决于编程语言和实现。
    循环比递归更好,因为它执行简单的条件检查和跳转,其中递归包括推送堆栈帧、跳转、返回并从堆栈弹出。

    在第二种情况下,递归是必需的,因为我们知道树的深度,所以我们不能在代码中放入那么多循环。

    对于任何一种情况,您都可以使用任何一种方法。递归将为您提供更简单、更易于维护和阅读的代码。可能会有性能代价,但这可能不会很大,特别是如果您能够使用尾部递归的话。从递归开始,然后只有在(i)需要更好的性能和(ii)使用循环时可测量的性能改进时,才转到循环,这可能是一个好主意。

    对于第二种情况,树的深度是不确定的,我正在进行尾部递归调用,以访问树的每个节点(这样就不用担心超过调用堆栈)但这里关注的是在第一种情况下使用递归方法,其中树保证最多有3层嵌套。您可以在不使用递归的情况下实现遍历,但使用我们自己的堆栈,这样就不会出现“堆栈调用超过”的问题。问题不在这两种方法中,我正在寻找强有力的理由为我的第一个方法重写代码在这种情况下,我使用了嵌套循环,并将其转换为递归,这样我就可以共享相同的代码在两个位置遍历树,而不会影响性能。(我在一棵树中处理约5000个或以上的节点)。所以使用第二种方法,使用我们自己的堆栈,但不使用递归。原因是简单的树深度并不是固定的