当前位置: 首页 > 知识库问答 >
问题:

递归和辅助方法在发现字符出现的有用性?

班浩皛
2023-03-14

我以前见过有人问这个问题寻求帮助,但我有一个不同的问题。

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

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个答案

汤枫
2023-03-14

正如Anubian Noob已经指出的那样:这个赋值的目的可能不是为了展示递归的一个特别有用的应用。实际上,您不会递归地实现此方法。这可能有严重的缺点:当数组太大时,您将收到一个堆栈溢出错误,因为递归调用的数量是有限的,请尝试使用1000、10000和100000个数组元素。

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

一般来说,递归背后有大量的理论考虑。在第一次编程赋值中,您将遇到的大多数示例都是原始递归函数的示例,它们在可计算性理论中起着重要作用。

羊舌航
2023-03-14

递归通常更好地用于不占用太多时间的事情,因为系统能够更好地处理它。然而,从长远来看,for循环更好,因为它是为此而设计的。

姜泳
2023-03-14

第一个代码示例使用递归。第二个代码示例使用迭代(以for each循环的形式)。第一个并不一定比第二个好。在你的例子中,我假设赋值的重点是熟悉递归。就我个人而言,我会使用第二个,因为它更清晰。

 类似资料:
  • 我无法找到此练习的正确解决方案,以下是任务: (数组中指定字符的出现次数)编写一个递归方法,用于查找数组中指定字符的出现次数。您需要定义以下两种方法。第二种是递归助手方法。 公共静态int计数(char[]chars,char ch) 公共静态int计数(char[]chars, char ch, int high) 编写一个测试程序,提示用户输入一行中的字符列表和一个字符,并显示该字符在列表中的

  • 本文向大家介绍PHP实现统计所有字符在字符串中出现次数的方法,包括了PHP实现统计所有字符在字符串中出现次数的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现统计所有字符在字符串中出现次数的方法。分享给大家供大家参考,具体如下: 先来看看效果: 算法: 循环一次字符串(本例的$str),把出现过的字符串记录在一个数组(如本例的$strRecord)内,如果已经此记录函数已经有

  • 本文向大家介绍C++实现递归函数的方法,包括了C++实现递归函数的方法的使用技巧和注意事项,需要的朋友参考一下 递归函数通俗来讲就是自己调用自己本身。这样有很大的好处,代码很方便简洁,把复杂的有规律的运算交给计算机去做。 1、首先定义问题。递归函数(recursion)需要设置一个函数,然后再可以循环往复的执行下去。 2、把问题换成公式。 如把阶乘之和定义为f(n)=n*f(n-1)。也就是说n*

  • 本文向大家介绍C#采用递归实现阶乘的方法,包括了C#采用递归实现阶乘的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#采用递归实现阶乘的方法,供大家参考之用。通常来说,如果想实现一个阶乘,比如6 * 5 * 4 * 3 * 2 * 1,首先想到的可能是循环遍历。 如下示例所示: 但以上的阶乘还有一种实现方式:6 * (6-1) * (6-2) * (6-3) * (6-4) * (

  • 我试图使用尾部递归局部辅助函数作为赋值的一部分来重新编写代码。 all_except_选项是一个返回类型为fn:string*string list的函数- 下面的函数是不使用尾部递归局部辅助函数的函数 这个函数使用尾部递归,但是我在递归调用助手函数时出错。错误是:错误:非构造函数应用于模式:all\u except\u选项中的参数

  • 数组 array_add 如果给定的键不在数组中,array_add 函数会把给定的键值对加到数组中。 $array = ['foo' => 'bar']; $array = array_add($array, 'key', 'value'); array_divide array_divide 函数返回两个数组,一个包含原本数组的键,另一个包含原本数组的值。 $array = ['foo'