在递归函数中,参数值根据递减递归值得到改变

时间:2016-02-29 20:43:25

标签: java recursion

在以下代码中,变量levelsToGogetAllStringNames()的递归调用时意外更新。当它返回到堆栈弹出时,我获得了传递给递归调用的levelsToGo的值,而不是先前存在的值。

public List<String> getAllStringNames(Student p, Integer levelsToGo)
{
    List<String> employeeSet = new ArrayList<String>();

    for(Student child : p.getAllSubjects())
    {
      employeeSet.add(child.getRoll());
      if(levelsToGo > 0)
      studentChilds.addAll(getAllStringNames(child, --levelsToGo))
    }

    return employeeSet;
}

我第一次通过student1时,levelsToGo为1,而student1有1个孩子。它以递归方式调用并将levelsToGo设置为0.当它返回到第一次迭代时,我们发现值仍为0.它应该是原始值1.

2 个答案:

答案 0 :(得分:3)

levelsToGo方法调用中使用它时,会递减getAllStringNames()。表达式--levelsToGo表示从levelsToGo的值中减去一个,将其存储回levelsToGo ,然后在方法调用中使用它。

相反,你应该写

studentChilds.addAll(getAllStringNames(child, levelsToGo - 1));

答案 1 :(得分:1)

不要递减整数变量,将新整数作为参数传递

studentChilds.addAll(getAllStringNames(child, levelsToGo - 1))