这是递归吗?它会起作用吗?

时间:2013-06-11 21:41:05

标签: java recursion

我创建了一个我认为是递归的方法。

    public AssaultTeam getTeam(String teamName) {
        for(AssaultTeam team : teams){
            if(team.getName().equals(teamName)){
                return team;
            }
        }
        AssaultTeam newTeam = new AssaultTeam(teamName);
        teams.add(newTeam);
        return getTeam(teamName);
    }

'teams'是AssaultTeam的ArrayList

我之前从未使用过递归,但我不确定这种方法是否有用。

5 个答案:

答案 0 :(得分:3)

是的,这是递归,递归是在调用方法本身时,你在代码return getTeam(teamNames);

的方法结束时这样做

是的,它会起作用,但有点奇怪,你实际上不需要这个解决方案的递归

public AssaultTeam getTeam(String teamName) {
        //iterate throught the teams list - OK
        for(AssaultTeam team : teams){
            if(team.getName().equals(teamName)){
                //if found - OK
                return team;
            }
        }
        AssaultTeam newTeam = new AssaultTeam(teamName);
        teams.add(newTeam);
        //call the getTeam, which will cause another iteration to find the item - NOT GOOD
        //return getTeam(teamName);
        //just return item you just created
        return newTeam;
    }

答案 1 :(得分:2)

它是递归的,因为该方法调用自身。由于其中一条评论中提到的==比较,它不起作用。您可以使用String#equals()方法来解决该问题。但是,递归是不必要的。你可以返回newTeam

答案 2 :(得分:1)

在递归中,该方法返回所需的结果(直接大小写)或用更简单的问题调用自身(递归情况)。

在您的情况下,直接案例可能是team.getName().equals(teamName),或者您到达数组的末尾,然后您可以返回team

您的递归案例可能是调用团队数组中的下一个元素。

public AssaultTeam getTeam(int index, String teamName)
{
    AssaultTeam team = teams.get(index);

    if (team.getName().equals(teamName))
    {
        return team;
    }
    else if (index == teams.size())
    {
        AssaultTeam newTeam = new AssaultTeam(teamName);
        teams.add(newTeam);
        return team;
    }
    else
    {
        ++index;
        return getTeam(index, teamName);
    }
}

答案 3 :(得分:0)

是递归吗?我认为技术上是,因为该方法有一个基本情况,否则会延迟回到自身。

然而,这并不是递归的一个特别好的例子,因为只有两种情况。在第二种情况下(团队不存在),递归调用将始终立即返回。正如其他人所说,用return newTeam替换最后一行更有意义,因为这完全等同(并且更简单/更容易理解)。

在稍微更深奥的一点上,递归倾向于与函数式编程风格相关联,这通常避免了可变变量。通常,递归方法将使用不同的参数再次调用方法,并且该方法将充当函数,即在给定相同输入的情况下将始终返回相同的结果。从技术上讲,你没有理由不能进行递归可变性,但个人说话会破坏我的先入之见并使我感到困惑。 (如果它采用两个整数并返回其最大值,则可以调用方法add的方式大致相同;它在技术上有效,但它会导致人们进行双重操作。)


如果有帮助,这是一个经典的递归示例 - 查看字符串列表是否包含给定元素:

public boolean recContains(String elem, List<String> list) {
    if (list.isEmpty())
        return false;
    else if (list.get(0).equals(elem))
        return true;
    else
        return recContains(elem, list.subList(1, list.length()));
}

请注意:

  • 这是有用的:给定相同的两个参数,它将始终返回相同的结果。
  • 它有一个简单的基本情况,递归不能再进一步,从它的参数派生(列表为空)。
  • 它有一个递归的情况,它再次调用该方法,但“减少”它的一个或多个参数,这样它们最终将成为基本情况。
  • 递归包含任意数量的迭代:虽然您的示例总是在最多一次递归调用之后完成,但这个示例理论上适用于任何大小的列表(具有许多递归调用)。

这些在技术上可能不是正确的递归方法所必需的,但它们肯定是我将与它们关联的那种属性。

答案 4 :(得分:0)

它会在运行中运行吗?是。

它能做你想做的事吗?否。

对象(如String)需要与Java中的.equals进行比较。由Nambari指出。

是递归吗?技术上是的,因为它自称。

它是递归的必要吗?不,你知道它应该返回什么,所以你应该把它归还。

你想做这样的事情:

public AssaultTeam getTeam(String teamName){
    for(AssaultTeam team : teams){
        if(team.getName().equals(teamName)){
            return team;
        }
    }

    AssaultTeam newTeam = new AssaultTeam(teamName);
    teams.add(newTeam);

    return newTeam;
}
编辑:我认为解释如何使用递归会很有用。

递归由两件事来定义。

  1. 它有一个不再自称的基本情况。
  2. 如果它不是基本情况,则通过实施一组规则向基础案例移动。
  3. 假设您有一个3x3的方格填充数字

    1 2 3 4 5 6 7 8 9

    你想从左上角开始,你可以向右或向下移动,你想要在右下角结束。如果您在踩到的方格中添加每个数字的总和,则需要知道最大可能值;

    一些伪代码

    int recurse(x,y)
      int max = 0;
    
      if can move right
        max = recurse(x+1,y)
      if can move down
        int tmp = recurse(x,y+1)
        if tmp greater than max
          max = tmp;
    
      return square[x][y] + max;
    

    只是一个使用递归的愚蠢示例。希望这有助于