【问题标题】:Use recursion to count the length of a string使用递归计算字符串的长度
【发布时间】:2013-11-15 20:33:15
【问题描述】:

我此时正在课堂上学习递归,对于一项作业,我们将使用递归来计算字符串的长度,而不使用 .getLength 或类似的东西。这是我尝试过的,但到目前为止我在第 20 行遇到错误并且很困惑。

import java.util.Scanner;


 public class StringCounter {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner kb = new Scanner(System.in);
    System.out.println("Enter a String: ");
    String s = kb.nextLine();
    System.out.println("The length of your string is: " + stringLength(s));
}

public static int stringLength(String s) {
    if (s.equals(""))
        return 0;
    else
        return stringLength(s.substring(0)) + 1;
}

}

【问题讨论】:

  • 什么样的错误?哪一行是 20?
  • StringCounter.stringLength(StringCounter.java:18) 的 StringCounter.stringLength(StringCounter.java) 的 java.lang.String.equals(Unknown Source) 的线程“main”java.lang.StackOverflowError 异常:21) 18 是 if 语句,21 是 else
  • s.substring(0) 返回 s... 所以你得到一个 StackOverflow 错误,因为你在堆栈上放了无数次对 stringLength 的调用,因为你一直用同样的事情一遍又一遍,s.equals("") 永远不会返回 true
  • 您的递归函数回答自己的次数比预期的要多,并且内存不足。

标签: java string recursion


【解决方案1】:

您正在执行无限递归,因为您传递的是相同的字符串。改为:

return stringLength(s.substring(1)) + 1;
                            //  ^

【讨论】:

  • 对于只有 1 个字符的字符串(索引 1 超出范围),此方法调用返回什么?
  • @nhgrif 官方文档说如果 beginIndex 为负数或大于此 String 对象的长度,则抛出 IndexOutOfBoundsException。您可以传递一个等于字符串长度的索引,并且您希望返回一个空字符串。
  • 好的。谢谢。我打算发布一个答案,但不熟悉这种情况下的行为(并且在我查找时发现,会有一个答案)。
【解决方案2】:

您可能遇到内存或堆栈溢出 (heh) 错误;试试

return stringLength(s.substring(1)) + 1;

【讨论】:

    【解决方案3】:

    对于递归调用中的子字符串调用,您从索引 0 开始。我猜你的意思是使用索引 1。当你更改为 s.substring(1) 时它可以工作

    【讨论】:

      【解决方案4】:

      你需要使用 stringLength(s.substring(1)) + 1;

      如果使用 s.substring(0),字符串值不会改变。这就是代码处于无限递归状态并因此抛出错误 java.lang.StackOverflowError 的原因。

      【讨论】:

        猜你喜欢
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 2012-10-04
        • 2018-08-31
        • 1970-01-01
        • 2019-09-01
        • 2020-03-15
        相关资源
        最近更新 更多