如何处理变量作为递归方法参数?

时间:2013-05-29 13:08:38

标签: java recursion

我想在xhtml页面上计算所有元素。我期望每个下一个元素都会以更大的顺序放入HashMap。

  

private void addComponents(HashMap的相关信息,             List components,Integer order,FacesContext context){

  System.out.println("Start: "+order);

  if ((components == null) || components.isEmpty())
  {
      System.out.println("return: "+order);
      return;
  }
  order = order + 1000;
  for (UIComponent c : components) {
      System.out.println("HashMap: "+order);
      infos.put(c.getClientId(context), order);
      addComponents(infos, c.getChildren(), order, context);
      System.out.println("Out: "+order);
      order = order + 1000;
  }
  System.out.println("End: "+order);
  return;
     

}

我有输出和错误的编号

HashMap: 1000

Start: 1000

return: 1000

Out: 1000

HashMap: 2000

Start: 2000

return: 2000

Out: 2000

HashMap: 3000

Start: 3000

HashMap: 4000

Start: 4000

return: 4000

Out: 4000

HashMap: 5000

Start: 5000

return: 5000
Out: 5000
HashMap: 6000

Start: 6000

return: 6000

Out: 6000

End: 7000

Out: 3000

HashMap: 4000

同样,以下方法效果很好

  

private int addComponents(HashMap的相关信息,             列出组件,整数顺序,FacesContext上下文             ){         if((components == null)|| components.isEmpty())             退货订单;

  for (UIComponent c : components) {

          order = order + 1000;
          infos.put(c.getClientId(context), order);

      order = addComponents(infos, c.getChildren(), order, context);

  }
  return order;
     

}

为什么这两种方法的工作方式不同?

2 个答案:

答案 0 :(得分:2)

您必须记住Java中的参数赋值不会影响该调用方法。因此,当您执行order = order + 1000时,这不会影响order调用实例中addComponents的值。通过返回值,您允许调用者将其值更新为递归调用的值。

解决此问题的一个选择是使用字段,但如果您是多线程的话,可能会遇到线程安全问题。

答案 1 :(得分:0)

第二种方法工作正常,因为递归传递的顺序值已经递增,因此它也反映在递归中。

在第一种方法中,按原样传递顺序值(不先递增),它将值传递给下一个递归;并且以相同的方式继续直到您到达递归的底部,订单值保持为1000并且在地图infos中填充相同的内容。

只有当堆栈展开时,订单值才会递增,但放在infos映射中的值仍然保持不变1000,尽管println()语句可能会让您不这么认为。