簡體   English   中英

(Java)使用遞歸方法創建子字符串時遇到麻煩

[英](Java) Trouble with creating a substring in a recursive method

我正在練習練習18.10,《 Java編程簡介》(綜合版)的第十版,其內容如下:

編寫一個遞歸方法,使用以下方法標題查找字符串中指定字母的出現次數:

public static int count(String str,char a)

因此,這是該方法的實現:

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

    if (str.charAt(str.length() - 1) != a)
        return 0;
    else
        return 1 + count(str.substring(0, str.length()), a);
}

我的基本情況是檢查最后一個字符是否為指定的“重復出現的字符”; 如果不是,則將“ 1”添加到字符在字符串中出現的次數,然后遞歸調用count方法。

在適當的位置運行該程序會導致StackOverflowError。 我猜這可能是由於無限遞歸造成的,而正是這部分代碼導致了問題:

str.substring(0, str.length())

麻煩的是,我不確定我是否完全理解原因。 substring(int beginIndex,int endIndex)方法的描述為

返回一個字符串,該字符串是該字符串的子字符串。 子字符串從指定的beginIndex開始,並擴展到索引endIndex-1處的字符。

因此,按照我的編寫方式,它應該返回一個子字符串,該子字符串包含原始字符串中除最后一個字符之外的每個字符,從而通過遞歸一次刪除該字符串中的一個字符。

我可以看到為什么這可能有問題,因為當字符串的長度為1或0時,沒有什么可告訴遞歸停止的,但是由於問題是StackOverflowError而不是IndexOutOfBounds異常,我有點丟失..

您應該使用[string - the_last_character] (遞歸地)調用該方法,因為已經檢查並計算了最后一個字符。

此外,您必須檢查字符串是否為空才能停止遞歸。

嘗試這個:

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

  if(str.length() == 0) // here we have to stop the recursion as the string is empty!
      return 0;
  if (str.charAt(str.length() - 1) != a)
      return count(str.substring(0, str.length() - 1), a); // here we send the string - the last character which has been already checked.
  else
      return 1 + count(str.substring(0, str.length() - 1), a);
}
return 1 + count(str.substring(0, str.length()), a)

這就是問題所在。 您正在使用整個字符串進行遞歸調用。 因此,該功能會不斷重復,檢查相同的字符。 而是返回一個子字符串:

return 1 + count(str.substring(0, str.length() - 1), a)

您還需要為str.length() == 0添加基本​​情況。

方法str.length()不返回字符串中最后一個字符的索引; 它返回字符串的長度。 考慮字符串“ A”-最后一個字符的索引為0(零),但是str.length()返回1。

因此,當前str.substring(0, str.length())返回的字符串等於整個字符串str

相反,您想要更改代碼,以使substring的第二個參數比字符串的長度少一個字符,以便結果比原始字符串短一個字符:

return 1 + count(str.substring(0, str.length() - 1), a);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM