在下面的代码中,对levelsToGo进行递归调用时,变量getAllStringNames()意外地更新。当它回到堆栈弹出时,我得到的是传递到递归调用中的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有一个孩子。它递归调用并将levelsToGo设置为0。回到第一次迭代时,我们发现该值仍为0。它应该是原始值1。

最佳答案

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

相反,您应该写

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

关于java - 递归函数中参数值根据递归值而变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35709246/

10-12 21:01