2013-10-07 8 views
-3

У меня есть простой Methode как это:Рекурсивный метод причиной StackOverflow

public int method(int a) {  
    if(// something){ 
     methode(a); 
    } 
}// end 

Как вы видите, это рекурсивный метод. Моя проблема заключается в том, что при увеличении глубины вызова Visual Studio выдает execption stackoverflow .

Как я могу решить эту проблему? Есть ли способ сохранить адрес возврата и локальные данные вручную и реализовать настраиваемый стек?

, пожалуйста, помогите мне.

Следует отметить, что я не хочу менять свой метод на нерекурсивный тип.

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

+4

Пожалуйста, выберите один тег для своего языка и не выпустите все и добавьте 'language-agnostic'. –

+0

Вы забыли пометить Python. – Maroun

+0

Спам для языковых тегов. –

ответ

3

Да, в C# (и, вероятно, в Java и т.д.) существует Stack<​T> class. Для вашего метода вы можете просто создать стек и сохранить там аргумент. Перебирайте стек, пока он не станет пустым.

Хотя это вводит итеративный цикл, ваш алгоритм все еще рекурсивный. (То есть сначала глубина вместо ширины)

Конечно, вам нужно убедиться, что ваш алгоритм в конечном итоге заканчивается. Это всего лишь способ увеличить пространство стека выше того, что дает вам операционная система. Windows выделяет определенное количество стекового пространства для каждого процесса, достаточного для большинства приложений. Если вам нужно больше, вы можете реализовать свою собственную структуру данных, подобную стеку, в куче. Куча обычно ограничена доступной оперативной памятью и «битностью» вашего приложения.

0

Необходимо уменьшить глубину рекурсии.

1

Как я могу решить эту проблему? Есть ли способ сохранить обратный адрес и локальные данные вручную и реализовать настраиваемый стек?

Рекурсивный метод должен иметь оконечную точку, где из результата возвращается.

0
public int method(int a){ 
//do stuff 
    var something = ... //you have to make sure something turns false at some point 
    if(something){ 
    method(a); 
    } 
} 
0

Как Данкен говорит: «Вы должны убедиться, что в какой-то момент что-то окажется ложным».

#define MAX 1000 

#include <iostream> 
using namespace std; 



int methode(int a){ 

    if(a>0 && a<MAX) return methode(a); 

    return 0 ; 

}// end 

int main(void){ 


    methode(1); 


    cout<<" \nPress any key to continue\n"; 
    cin.ignore(); 
    cin.get(); 

    return 0; 
} 
+0

Но почему C++ в C# вопрос? – Anarion

Смежные вопросы