簡體   English   中英

這個遞歸程序的堆棧溢出錯誤? - C ++

[英]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);
}

沒有什么變化st所以這可能永遠不會停止。

在編寫遞歸函數時,您應該始終記住兩件事:您需要停止條件來結束遞歸,並且您必須在每次函數調用時更接近停止條件。 如果您未能檢查停止條件,或者如果您的函數在每次調用期間沒有接近停止條件,您將遇到堆棧溢出(或無限循環)。

第一個函數中的問題是它沒有接近停止條件。 最后你“返回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.

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