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

递归函数中Javahelper方法读取字符串

狄雅珺
2023-03-14

我遇到了一个问题,在我已经工作的递归函数中添加了一个助手方法,只使用了2个参数,当添加第三个(助手方法)时,我的代码中断并寻找解决方案。该程序使用扫描仪对字符串进行键盘输入,对字符进行另一次输入,然后输出字母的出现次数。该错误发生在第二条if语句和两条return语句上。在第二次键盘输入后,我发现了错误:

线程"main"中的异常java.lang.StringIndexOutOfBoundsException:超出范围的字符串索引:-1

import java.util.Scanner;

public class recursiveString {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("Enter a string: ");
        String input = sc.nextLine();
        System.out.println("Enter a character to find number of occurences: ");
        char character = sc.next().charAt(0);
        System.out.println(character + " occurred " + count(input, character, input.length() - 1) + " times.");

    }

    public static int count(String str, char a, int high) {

        if (str.length() == high) // set equal to high to stop the recursion from infinitely looping
            return high;
        if (str.charAt(str.length() - 1) != a) // if the character in the string is  not equal to "a" subtract from count(substring)
            return count(str.substring(0, str.length() - 1), a, high - 1);
        else 
            return 1 + count(str.substring(0, str.length() - 1), a, high - 1); 
            // else add +1 to count for each instance of "a" in the string

    }

}

共有2个答案

太叔睿
2023-03-14

这里有一个可能的解决方案,可以帮助您避免索引越界:

public static int count(String str, char a, int high) {

    if (str == null || str.length() == 0) {
    // just to be extra safe, if we have an empty string or null 
        return 0;

    }
    //changed this end condition - now high describes how many steps we take before returning the answer
    if (high == 0) // to stop the recursion from infinitely looping
        return high;
    if (str.charAt(str.length() - 1) != a) // if the last character in the string is not equal to "a" subtract from count(substring)
        return count(str.substring(0, str.length() - 1), a, high - 1);
    else 
        return 1 + count(str.substring(0, str.length() - 1), a, high - 1); 
        // else add +1 to count for each instance of "a" in the string

}
简俊楚
2023-03-14

您缺少递归方法的设计:首先,您应该关注一个问题,并为基本情况或多个情况定义它。

我对这个问题的看法是,基本情况是空字符串(但即使在这之前,也要确保它不是null),或者如果高设置为0。

我对high的理解是,您可以使用它来设置要检查字符a出现的字符串的多少个字符;随着字符串变得越来越大,检查会更直接,将字符a的搜索出现的含义赋予str.substring(0, high),但我试图保持它与您的代码相似。

//we'll use high to "tell" the count method how many characters it will consider into the occurrences from the end of the given string
public static int count(String str, char a, int high) {
    //if the string isn't valid or high just tells it to stop, return 0 as there can be no occurrences of a in str
    if(str == null || str.equals("") || high == 0)
      return 0;

    // if the last character in the string is not equal to a, let's just shrink the string
    if (str.charAt(str.length() - 1) != a)
        return count(str.substring(0, str.length() - 1), a, high - 1);

    // otherwise add this 1 occurrence to the ones it will find in the rest of the string
    else 
        return 1 + count(str.substring(0, str.length() - 1), a, high - 1); 
}

main中的调用将是:

System.out.println(character+ " occurred " + count(input, character, input.length()) + " times.");
 类似资料:
  • 本文向大家介绍C#递归读取XML菜单数据的方法,包括了C#递归读取XML菜单数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#递归读取XML菜单数据的方法。分享给大家供大家参考。具体分析如下: 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据写在数据库表,然后直接读取加载到菜单树上显示。 现在想把菜单数据都放在XML里,然后递

  • 我需要一些帮助在Java:我有一个函数签名,我不能改变,我的函数需要递归和返回字符串数组没有任何选项添加到签名。 这是我的签名: 该函数在TRIE结构中查找相似的单词,在它们之间有K个字母变化的差异。 例如-在单词“bike”和k=2的TRIE中,该函数将返回一个(包含nice和nine)。 我不是在寻找解决方案,只是为了一个返回字符串数组的方法。 **我用我收到的签名编写了一个函数作为包装器,但

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

  • 问题 你想在一个函数中调用相同的函数。 解决方案 使用一个命名函数: ping = -> console.log "Pinged" setTimeout ping, 1000 若为未命名函数,则使用 @arguments.callee@: delay = 1000 setTimeout((-> console.log "Pinged" setTimeout arg

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n 所以,fact(n)可以表示为n x fact(n-1),

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n)=n!=1\times2\times3\times\cdot\cdot\cdot\times(n-1)\times n=(n-1)!\times n=fact(n-1)\times n