Исключение во время выполнения, слишком глубокая рекурсия - PullRequest
8 голосов
/ 05 ноября 2010

Я преобразовал псевдокод здесь в C # и рекурсивно повторил его 10000 раз.Но я получаю ошибку во время выполнения C #, StackOverflow Exception после 9217 раз.Как я могу предотвратить это?

РЕДАКТИРОВАТЬ Если это кому-нибудь поможет, вот код:

    private double CalculatePi(int maxRecursion)
    {
        return 2 * CalculatePi(maxRecursion, 1);
    }

    private double CalculatePi(int maxRecursion, int i)
    {
        if (i >= maxRecursion)
            return 1;
        return 1 + i / (2.0 * i + 1) * CalculatePi(maxRecursion, i + 1);
    }

    double pi = CalculatePi(10000); // 10,000 recursions

РЕДАКТИРОВАТЬ2 Так что, кажется, все согласны с тем, чтомне нужно преобразовать это в итеративный ... кто-нибудь может дать код?Я не могу написать какой-либо итеративный код, который работает ...

EDIT Спасибо Полу Рику за этот ответ, который я протестировал, и он работает:

    private static double CalculatePi(int maxRecursion)
    {
        double result = 1;
        for (int i = maxRecursion; i >= 1; i-- )
        {
            result = 1 + i / (2.0 * i + 1) * result;
        }
        return result * 2;
    }

Ответы [ 12 ]

0 голосов
/ 05 ноября 2010

Рекурсивные вызовы функций - это почти всегда ужасный способ сделать что-либо.

Я бы просто получил значение pi из файла заголовка / библиотеки математики.

0 голосов
/ 05 ноября 2010

Это не бесконечная рекурсия, очевидно, поскольку она останавливается после 10 000 уровней, но это все еще не лучшая идея.

Десять тысяч уровней стека - это ужасно много - стек не огромныйресурс.Вы должны преобразовать его в итеративное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...