【问题标题】:Is there a way to create a unique variable with each recursion?有没有办法为每次递归创建一个唯一变量?
【发布时间】:2015-07-19 01:57:23
【问题描述】:

是否可以创建一个对该递归级别唯一的变量,以便无论其他递归步骤如何,无论发生什么都将保持这种状态?并且这可以通过递归完成后在每个递归步骤中检索变量中的值的方式来完成吗?

让我用一个例子来形象化这个问题。假设我有一棵树。我想记录每个节点的深度级别,并对其进行组织,以便每个深度级别的所有节点都捆绑在同一个数组或列表中。所以我需要为每个深度级别使用不同的数组/列表。

我正在递归遍历树。在每次递归开始时,我都会创建一个新列表。 这是同一行,因此每次递归都会创建一个具有相同名称的列表变量。 我正在处理深度 X 中的一个节点。我将此节点添加到列表中,然后(递归地)继续到子节点在深度 X + 1。我将此子节点添加到新列表中。以此类推,直到树中的所有节点都属于某个列表。

递归完成后,我希望列表的数量等于树的高度(每个深度 1 个列表,包含该深度中的所有节点),以及访问所有节点中所有节点的方法列表。

这可能吗?

【问题讨论】:

  • timestamp怎么样
  • 递归方法中的局部变量对于该特定调用来说是唯一的。
  • akhil,我担心在您的情况下,先前递归中的变量会以某种方式被覆盖或丢失。我这样想对吗?
  • 您只需要在调用递归方法之前声明一个列表列表,并将列表作为参数传递给递归方法。从方法调用返回后,列表应该仍然包含您需要的所有信息。
  • 与其尝试和玩这些东西,不如尝试设计一个相关的数据结构,你不觉得吗?

标签: java recursion tree depth


【解决方案1】:

将值存储在列表中,将每个新值附加到列表中。列表中值的索引将是添加该值的递归深度。

【讨论】:

    【解决方案2】:

    您可能需要一个Map<Integer, List<?>>,其中键是深度,值是针对该深度放置项目的列表。 Map 是这里最通用的对象,因为它可以用于深度优先或呼吸优先搜索。

    Map 必须是递归方法签名的一部分,或者是可从递归方法访问的实例变量。

    【讨论】:

      【解决方案3】:

      您不知道您有多少级别,因此您无法在此之前列出列表。但是你可以使用地图。例如Map<Integer,List<Node>>。将其传递给递归函数并使用当前级别作为键。

      最后你会得到这样的地图:

      1:节点列表

      2:节点列表

      ....

      【讨论】:

        【解决方案4】:

        在递归中,您不知道您的“递归级别”,但您可以轻松拥有一个可用的映射 Map<int, List<...>,例如作为递归的参数,您可以在其中存储每个级别的节点列表。

        【讨论】:

          【解决方案5】:

          您需要创建一个节点集合数组,然后,在将当前 n 深度节点添加到结构时,只需将其添加到第 n 个集合中。 Here you can find more info on how to create an array of lists.

          【讨论】:

            【解决方案6】:

            您可以在内部维护一个 local variable 方法,该方法将保持不变!

            考虑递归阶乘

            的基本示例
            public int calculateFactorial(int number){ //User will call this method
                return factPreservingOriginalValue(number,number);
                     |
                     |
                     -----> Internally you call a method to maintain original value
            }
            

            另一种方法

            public int factPreservingOriginalValue(int orig,int number){ // orig will remain same
                      if(number==0)
                           return 1;
                      return number*factWithTempVariable(orig,number-1);
            }
            

            您可以使用此orig value 来了解遍历树时任何时间点的深度

            【讨论】:

              【解决方案7】:

              你可以使用 POJO:

              • 在递归开始时创建新的 java bean 对象
              • 存储你唯一的递归值
              • 在递归结束时将该对象添加到列表中
              • 递归完成后根据需要处理列表

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-12-13
                • 1970-01-01
                • 1970-01-01
                • 2020-09-22
                • 1970-01-01
                • 2013-08-11
                • 2013-04-14
                相关资源
                最近更新 更多