[英](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.