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