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

使用递归计算'a'的实例

唐阳飇
2023-03-14

我有一个家庭作业,Java开始计算单词或短语中“a”的实例。我收到以下错误。

异常在线程"main"java.lang.StringIndexOutOfBoundsExctive: String index out of

以下是代码

import java.util.Scanner;

public class aHomework 
{
public static void main( String [] args )
{
    Scanner inputW = new Scanner(System.in);

    String input = inputW.nextLine();
    countAInWord(input, input.length());    
}

public static void countAInWord( String w , int n)
   {

 int aCount = 0;
 if ( n > 0 )
 {
     if (w.charAt(n) == 'a')
     {
         aCount++;
     }
     else
     {
         n = n-1;
         countAInWord(w, n);
     }
 }
 else
     System.out.println("The number of A's is " + aCount);
   }
}

我一直在寻找递归问题,并且学到了很多。

然而,我更愿意修复我的代码,而不是仅仅应付别人。

因此,如果有人能告诉我为什么我会收到上述错误,我将不胜感激。

共有2个答案

徐翔
2023-03-14

回答你的输出问题

变量aCount应该声明为函数中的参数之一,如CountAInWord(String w, int n, int aCount),以便aCount的值可以传递到函数的每次迭代中

这是因为函数中声明的变量只能在函数中访问。

在您的情况下,每次调用函数countAInword时,都会声明一个新的aCount,对该变量的任何增量只会影响该函数调用中的aCount实例。

再次调用同一函数时,该值不会传递到该函数调用中。而是再次声明另一个而非帐户。

因此,当您最终打印aCount的值时,您正在打印最后一个函数调用的aCount的实例。

最后,您应该删除else语句,因为应该执行其中的代码,而不管在该迭代中是否找到“a”

希望这有帮助

钱德元
2023-03-14

你得到错误的原因是因为你设置n为input.length()。假设字符串是“halo”,input.length()将返回4。

但是当你使用字符串的时候。charAt()方法,字符串索引是基于0的,也就是说,可以调用的最大值是string。charAt(3)应该返回“o”。但是,由于使用n=4调用递归函数,因此在代码中它将调用string。字符(4)在该字符串中不绑定。这样你就得到了这个错误。:)

尝试用输入调用递归方法。长度()-1:D

public static void main( String [] args )
{
    Scanner inputW = new Scanner(System.in);

    String input = inputW.nextLine();
    countAInWord(input, input.length()-1);    
}

其他一些bug:(参见代码中的注释)

public static void countAInWord( String w , int n)
{

int aCount = 0; // Everytime you enter this recursive function, it will reset to 0, which should not be the case.
if ( n > 0 )
{
     if (w.charAt(n) == 'a')
     {
         aCount++;
         // Yeah you found an 'a', then what? You should call the recursive function again to continue checking. (like how you do it in the else function below)
     }
     else
     {
         n = n-1;
         countAInWord(w, n);
     }
 }
 else
     System.out.println("The number of A's is " + aCount);
   }
}
 类似资料:
  • 我得到了三个整数操作: A-将3添加到number B-将数字 C加倍-交换number 的最后两位数字我应该编写算法来检查我是否可以在n步中使用操作A、B、C制作k素数。最后,我必须打印我用来制作k素数的操作序列。让我们假设我们有函数: 当数字为素数时,函数ifprime返回true,否则返回false。 代码: 我的问题是,我不知道如何记住正确的路径,然后打印出来。

  • 本文向大家介绍C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法,包括了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法。分享给大家供大家参考,具体如下: 希望本文所述对大家C++程序设计有所帮助。

  • 我知道这个问题已经被问过很多次了,但是我的问题有点不同。这个任务要求我不验证一个字符串是否是回文——而是验证一个字符串中有多少回文(返回为“int”)。这应该使用迭代函数来完成 以下是我的迭代函数代码供参考: 我只是很难把它转换成递归函数。感谢所有帮助!

  • 本文向大家介绍Java算法之递归算法计算阶乘,包括了Java算法之递归算法计算阶乘的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享的java算法计算阶乘,在学习Java课程时经常会遇到求阶乘问题,今天接跟大家一起探讨一下 代码如下: 运行结果:

  • 本文向大家介绍java递归算法的实例详解,包括了java递归算法的实例详解的使用技巧和注意事项,需要的朋友参考一下 递归三要素: 1、明确递归终止条件; 2、给出递归终止时的处理办法; 3、提取重复的逻辑,缩小问题规模。 1、1+2+3+…+n 2、1 * 2 * 3 * … * n 3、斐波那契数列 前两项均为1,第三项开始,每一项都等于前两项之和。即:1,1,2,3,5,8,… 4、二叉树的遍

  • 本文向大家介绍Java使用递归解决算法问题的实例讲解,包括了Java使用递归解决算法问题的实例讲解的使用技巧和注意事项,需要的朋友参考一下 解释:程序调用自身的编程技巧叫做递归。 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模