递归和辅助方法在查找字符出现时的用处是什么?

时间:2014-05-04 01:16:37

标签: java loops recursion

所以我之前已经看过这个问题,但是我对它有一个不同的问题。

问题是:(在数组中出现指定的字符)编写一个递归方法,查找数组中指定字符的出现次数。您需要声明以下两种方法。第二个是递归辅助方法。

public static int count(char[] chars, char ch)

public static int count(char[] chars, char ch, int high)

以下代码完美无缺:

public class RecursiveCharacterOccurences {
    public static int count(char[] chars, char ch) {
        return count(chars, ch, chars.length - 1);
    }

    private static int count(char[] chars, char ch, int index) {
        if (index == -1) {
            return 0;
        }
        if (chars[index] == ch) {
            return 1 + count(chars, ch, index - 1);
        }
        return count(chars, ch, index - 1);

    }

    public static void main(String[] args) {
        char[] test = {'a', 'b', 'a', 'c', 'd', 'a', 'e', 'a', 'f', 'g', 'h', 'a', 'i', 'a'};

        System.out.println(count(test, 'a'));
    }
}

我想知道是否有人可以解释为什么它比下面的代码好得多,我先实现了这一点,然后才意识到它实际上不是递归,但对我来说似乎代码要少得多。

public class RecursiveCharacterOccurences {
    public static int count(char[] chars, char ch) {
        return count(chars, ch, 0);
    }

    private static int count(char[] chars, char ch, int count) {
        for (char a : chars) {
            if (a == ch) {
                count++;
            }
        }
        return count;
    }

    public static void main(String[] args) {
        char[] test = {'a', 'b', 'a', 'c', 'd', 'a', 'e', 'a', 'f', 'g', 'h', 'a', 'i', 'a'};

        System.out.println(count(test, 'a'));
    }
}

谢谢!

3 个答案:

答案 0 :(得分:2)

第一个代码示例使用递归。第二个代码示例使用迭代(以for-each循环的形式)。第一个并不比第二个好。在你的情况下,我假设分配的目的是熟悉递归。我个人会使用第二个,因为它更清晰。

答案 1 :(得分:1)

递归对于不占用太多时间的事情通常更好,因为系统能够更好地处理它。但是,for循环在长期内更好,因为它是专为此而设计的。

答案 2 :(得分:1)

正如Anubian Noob已经指出的那样:这个赋值的目的可能不是显示一个特别有用的递归应用。在实践中,您将递归地实现此方法。这可能有严重的缺点:当数组太大时,您将收到StackOverflowError,因为递归调用的数量是有限的 - 尝试一下,可能有1000,10000和100000个数组元素。

目的是提供一个易于理解的示例,但仍然比递归函数的简单示例(如阶乘函数)更复杂一些。它显示了一种非常通用的模式,可以应用于各种各样的问题。特别是,“辅助”功能的概念非常有用。简单地说:它引入了另一个参数,告诉你递归必须重复多长时间。

一般来说,递归背后有相当多的理论考虑因素。您在第一个编程任务中遇到的大多数示例都是Primitive Recursive Functions的示例,它们在可计算性理论中发挥着重要作用。