[英]Stack Overflow Error With This Recursive Program? - C++
我是第一個C ++類的編程學生,最近我們獲得了一個賦值來實現一個遞歸程序,該程序查找給定字符串中給定子字符串的第一次出現。
例如:
int StringIndex("Mississippi", "sip"); // this would return 6
我們給出的提示是使用遞歸輔助函數,該函數將索引作為參數。
這是我到目前為止所做的:
int index_of(string s, string t)
{
int index = 0;
if (s[index] == NULL)
return -1;
else if (starts_with(s, t, ++index))
{
return index;
}
return index_of(s, t);
}
bool starts_with(string s, string t, int index)
{
if (t[index] != s[index] || s[index] == NULL)
return false;
return starts_with(s, t, ++index);
}
我收到堆棧溢出錯誤,我不明白為什么。 那么有人會介意幫助我理解為什么我會收到這個錯誤嗎? 並幫助我指出正確的方向,如何解決它?
int index_of(string s, string t)
{
...
// Your are calling yourself without modifying the
// input parameters. If you get here once, you'll
// never break out.
return index_of(s, t);
}
沒有什么變化s
或t
所以這可能永遠不會停止。
在編寫遞歸函數時,您應該始終記住兩件事:您需要停止條件來結束遞歸,並且您必須在每次函數調用時更接近停止條件。 如果您未能檢查停止條件,或者如果您的函數在每次調用期間沒有接近停止條件,您將遇到堆棧溢出(或無限循環)。
第一個函數中的問題是它沒有接近停止條件。 最后你“返回index_of(s,t)”而不同時修改s或t。 因此,函數將一次又一次地使用相同的參數重新開始,直到遇到堆棧溢出。
另一個問題是你的starts_with函數。 它只返回false但從不真實。
當你說:
s[index] == NULL
你應該知道C ++ std :: strings不需要在內部以null結尾 - 而是使用字符串的size()
成員函數代替。 此外,您正在按值傳遞字符串,對於長字符串,這可能會快速占用堆棧空間和動態內存。 將它們作為const引用傳遞:
bool starts_with( const string & s, const & string t, int index)
{
...
}
最后,正如其他人所指出的那樣,只有一個函數,在這種情況下, starts_with()
應該是遞歸的。 事實上, index_of()
似乎毫無意義。
A)“starts_with”從不返回true。 所以你永遠不會退出index_of遞歸。
B)index_of在recurse上沒有做任何事情,它只是用相同的信息再次調用自己。
基本上上面的2個問題導致無限循環。 您經常檢查相同的信息,並且沒有退出該循環的可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.