0

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

    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

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

4

5 回答 5

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;
    }
于 2013-06-11T21:46:03.793 回答
2

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

于 2013-06-11T21:47:58.430 回答
1

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

在您的情况下,直接情况可能是team.getName().equals(teamName)或者您到达数组的末尾,然后您可以 return 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);
    }
}
于 2013-06-11T21:52:26.957 回答
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()));
}

请注意:

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

对于适当的递归方法,这些可能在技术上不是必需的,但它们绝对是我会与它们相关联的那种属性。

于 2013-06-11T22:05:07.913 回答
0

它会像运行一样工作吗?是的。

它会做你想让它做的事吗?不。

对象(如字符串)需要与 Java 中的 .equals 进行比较。作为南巴里的指针。

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

它是否需要递归?不,你知道它应该返回什么,所以你应该返回它。

你想做这样的事情:

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. 如果它不是一个基本案例,它会通过实施一组规则向基本案例移动。

假设你有一个 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;

只是一个愚蠢的例子,说明你会在哪里使用递归。希望这有帮助

于 2013-06-11T22:12:52.933 回答