2015-02-28 3 views
0

Я пытаюсь написать рекурсивный алгоритм, который печатает все возможные комбинации номеров символов из мобильного телефона. Как старые добрые телефоны; 2: ABC, 3: DEF и так далее.Ошибка сегментации в рекурсивном алгоритме

Ex 23 должен печатать AD, AE, AF, BD, BE, BF, CD, CE и CF. Я написал следующий алгоритм, и я верю, что он должен работать. Хотя я не знаю, потому что ни один из моих компиляторов не позволит ему закончить.

#include <iostream> 
#include <string> 
#include <cstring> 

using namespace std; 
static int totalNbr = 0; 


void coolKey(string number, string result) 
{ 
    totalNbr++; 
    string keychar[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 


int nbrSize = number.length(); 


if (nbrSize == 0) // Basecase - We've reached 0 didgets 
{ 
    cout << result << endl;  
    return; 
} 

else 
{ 

    for (int i = 0; i < keychar[(number[0]-'0')].length(); i++) 
    { 

     result += keychar[(number[0]-'0')][i]; // Append char to result. 
     number = number.erase(0,1);   // Remove first didget of the number (eg. "234" becomse "34") 
     coolKey(number,result);    // Call coolKey with the new variables. 
    } 

} 

} 


int main() 
{ 

    coolKey("23", ""); 
    return 0; 
} 

Выход:

ad                                               
Segmentation fault                                           

Я попытался найти ошибку, и это, кажется, своего рода переполнение стека, или доступ только для чтения памяти - но я не могу похоже, выясняют, где это происходит. Сначала я думал, что это было удаление строковых символов, но это не решило проблему.

Я бы так, если кто-нибудь благодарностью мог бы дать мне подсказку здесь :-)

С наилучшими пожеланиями, Бен

+0

Вы столкнулись с переполнением стека из-за бесконечной рекурсии? Также в качестве эталонного параметра должен быть передан 'result'. –

+0

Это может помочь вам: [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – horns

ответ

0

Вы, видимо, пытаются стереть первую цифру (number = number.erase(0,1);) для каждого возможного письма, представленного цифру.

Вы должны написать эту строку перед циклом for, а не внутри цикла. И еще до этого сохраните стираемую цифру, чтобы позднее ее использовать в заголовке цикла.