如何在Java中将带有嵌套for循环的迭代非动态方法转换为递归动态方法

时间:2019-06-26 18:05:54

标签: java recursion

我有一个SED_PP类,该类具有一个名为children的ArrayList,其中包含其他SED_PP。我正在尝试编写一种方法,该方法可以告诉用户一个SED_PP对象是否可以是另一个SED_PP对象的孩子。

我有一个迭代且非动态的方法isChild(SED_PP sed),它不会遍历子对象具有的对象中的所有数组列表。

public class SED_PP 
{
    private ArrayList<SED_PP> children = new ArrayList<SED_PP>();

    public ArrayList<SED_PP> getChildren() { return children;}
    //other methods

    public boolean IsChild(SED_PP sed)
    {
        boolean answer = false;
        if (this.children.contains(sed))
            answer = false;
        else{
            for (SED_PP s : this.children){
                if(!s.getChildren().isEmpty())
                    answer = true;
                }
            }
        }

        return answer;
    }
}

所示的isChild方法不会遍历父SED_PP对象拥有的所有数组列表。例如,如果父A的孩子为B,B的孩子为C,C的孩子为D,则当前的isChild方法在应该为A.IsChild(D)时不会返回true。

我认为我需要对这个问题使用递归,但是我不是很擅长。

1 个答案:

答案 0 :(得分:0)

您无需递归即可解决问题。您的代码只需要对此部分进行修复

for (SED_PP s : this.children) {

     if(!s.getChildren().isEmpty()) {
        answer = true;
     }
}

您没有检查B是否有孩子C和C是否有孩子D,您仅询问B是否有孩子。您应该以这种方式更改IsChild方法代码。

public boolean IsChild(SED_PP sed)
{       
    if (this.children.contains(sed)) {
        return true;
    } 

    for (SED_PP s : this.children) {

        if (s.IsChild(sed)) {
            return true;
        }            
    }

    return false;
}