Так что, похоже, все согласны с тем, что мне нужно преобразовать это в итеративное ... Кто-нибудь может дать какой-нибудь код?Кажется, я не могу написать ни одного итеративного кода, который бы работал ...
Вы просите рыбу или учите, как ее ловить?Если цель этого упражнения состоит в том, чтобы научиться преобразовывать рекурсивный код в итеративный код, то вам не достаточно просто получить ответ.
Чтобы преобразовать рекурсивный код в итеративный код, существует множество возможных способовсделай это.Самый простой способ в этом случае - просто разработать шаблон.Что делает код?Он вычисляет:
(1 + 1 / (2.0 * 1 + 1)) *
(1 + 2 / (2.0 * 2 + 1)) *
(1 + 3 / (2.0 * 3 + 1)) *
(1 + 4 / (2.0 * 4 + 1)) *
(1 + 5 / (2.0 * 5 + 1)) *
(1 + 6 / (2.0 * 6 + 1)) *
(1 + 7 / (2.0 * 7 + 1)) *
...
(1 + 9999/ (2.0 * 9999+ 1)) *
1
Теперь вы можете написать цикл, который вычисляет это?Конечно.
double product = 1.0;
for (int i = 9999; i >= 0; --i)
product *= (1 + i / (2.0 * i + 1));
Это самый простой способ сделать это.Но есть много способов решить эту проблему.
Вы можете использовать агрегатор .Рассмотрим «общую» операцию;это пример агрегатора.У вас есть последовательность вещей, и вы сохраняете их промежуточный итог, накапливая результат в накопителе.Для стандартных операторов запросов предусмотрена операция агрегирования:
double seed = 1.0;
Enumerable.Range(0, 10000).Aggregate(seed,
(product, i) => product * (1 + i / (2.0 * i + 1))
Или вы можете сохранить свой алгоритм рекурсивным, но устранить переполнение стека путем:
- построения собственной структуры стекав куче
- определение виртуальной машины, написание вашей программы на языке виртуальной машины, а затем реализация виртуальной машины для сохранения ее стека в куче.
- переписывание вашей программы в Continuation Passing Style;каждый шаг на этом пути затем возвращает продолжение вызывающей стороне, которая вызывает следующее продолжение;стек никогда не углубляется
Объяснение этих методов занимает слишком много времени для одного ответа.У меня есть серия из шести статей о том, как использовать эти методы для превращения рекурсивных программ в программы, которые не потребляют много стека;начните читать здесь:
http://blogs.msdn.com/b/ericlippert/archive/2005/07/25/recursion-part-zero.aspx