Java递归;我怎样才能简化我的所有内容?

时间:2013-11-06 07:01:08

标签: java recursion

我必须编写以下递归方法:

public static int countA(String s)

然而,我发现如果不宣布计数器和位置变量就不可能做到这一点;像这样:

public static int countA(String s, int position) {

        int count = 0;

        if( s.charAt(position) == 'A' )
            count++;

        if( position + 1 < s.length() ) {
            count += countA(s, position + 1);
        }

        return count;
    }

如何简化我的答案,以便我的方法与列出的方法相同?

编辑:是的,我想计算字符串中的所有A。

6 个答案:

答案 0 :(得分:3)

试试这个:

public static int countA(String s) {
    int count = 0;

    if (s == null)
        return 0;

    if (s.length() == 0)
        return 0;

    if (s.charAt(0) == 'A')
        count++;

    return count + countA(s.substring(1));
}

答案 1 :(得分:1)

有两种递归形式,

  • 尾递归:返回值计算为当前子例程的值和下一个调用的返回值的组合。例如,

    int factorial(int a) {
        if(a==0)
            return 1;
        else
            return a * factorial( a-1 );
    }
    
  • 基于累加器的递归:您通过添加其他参数来累积结果并返回累计值。

    int factorial(int a, int fact) {
        if(a==0)
            return fact;
        else
            return factorial(a-1, a*fact);
    }
    

显然你所拥有的是基于累加器的,而你可以将它改进为Tail递归。

尾递归被认为更具可读性,虽然它可能导致StackOverflow ! (没有双关语)。这是因为它必须在再次调用子例程之前将当前值推送到堆栈。当你进行大量此类调用时,此堆栈可能会超出其限制。

为了避免这个问题,有些编译器会优化尾递归到累加器。

答案 2 :(得分:0)

怎么样:

public static int countA(String s) {
        if(s==null) return 0;
        if(s.length()==0) return 0;
        if( s.charAt(0) == 'A' )
        {
            return 1 + countA(s.substring(1));
        } else 
        {
            return countA(s.substring(1));
        }
    }

答案 3 :(得分:0)

我觉得这样的事情应该可以解决问题 这里我们假设countA返回String内部的As数

public static int countA(String s)
{
    if(s.length()==0) return 0;  // return 0 if string is empty
    else
    {
        // if the first char is A add 1 to the answer, recurse
        if(s.toCharArray()[0])=='A') return 1+countA(s.subString(1,s.length()));

        // else add nothing to the answer, recurse
        else return countA(s.subString(1,s.length()));
    }
} 

答案 4 :(得分:0)

您将position变量移出方法并将其设为static(因为您的countA()也是static)。

static int position = 0;
public static int countA(String s) {
    int count = 0;
    if( s.charAt(position) == 'A' )
        count++;
    if( position + 1 < s.length() ) {
        position++;
        count += countA(s);
    }
    return count;
}

答案 5 :(得分:0)

理想情况下,您首先拥有终止条件,然后通常通过减少缩进/嵌套来简化代码,并为其执行“不执行任何操作”(通常需要比绝对要求多一次迭代)。

您也不需要本地变量!

public static int countA(String s, int position) {
    if (position == s.length())
        return 0;
    return (s.charAt(position) == 'A' ? 1 : 0) + countA(s, position + 1);
}