Я пытаюсь вычислить числа Pell, однако я всегда получаю возможность Cannot evaluate expression because the current thread is in a Qaru state.
исключение, так как метод называется рекурсивным.
static int calcPell(int input)
{
int i = 0;
try
{
if (input == 0 || input == 1)
return input;
else
return i = (2 * calcPell(input - 1) + calcPell(input + 1));
}
catch(Exception ex)
{
Console.Write(ex.Message);
}
return i;
}
Согласно http://en.wikipedia.org/wiki/Pell_number, должно ли оно быть
return 2 * calcPell(input - 1) + calcPell(input -2);
Программа идет в бесконечной рекурсии, как в этой строке
return i = (2 * calcPell(input - 1) + calcPell(input + 1));
вызов функции calcPell(input + 1)
будет бесконечным, так как нет верхнего предела, определенного
Ваш алгоритм для расчета номеров Pell неверен и не будет завершен, если предоставленный вход больше 1. Поскольку ваш компьютер имеет ограниченные ресурсы, он заканчивается переполнением стека.
Проблематичной частью является то, что calcPell(int input)
вызывает calcPell(input + 1)
. Вызов calcPell(2)
вызовет calcPell(3)
который вызовет calcPell(4)
и это продолжается бесконечно, потому что только calcPell(0)
и calcPell(1)
рекурсию.
В статье Википедии о номерах Pell вы можете увидеть правильное отношение повторения:
В вашей реализации вы должны исправить второй оператор return:
return 2 * calcPell(input - 1) + calcPell(input - 2);