我正在尝试计算Pell数字,但是我总是以Cannot evaluate expression because the current thread is in a stack overflow 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;
}
答案 0 :(得分:5)
根据http://en.wikipedia.org/wiki/Pell_number,它应该是
return 2 * calcPell(input - 1) + calcPell(input -2);
答案 1 :(得分:1)
您计算Pell编号的算法不正确,如果提供的输入大于1,它将不会终止。因为您的计算机资源有限,它会因堆栈溢出而终止。
有问题的部分是calcPell(int input)
调用calcPell(input + 1)
的地方。致电calcPell(2)
会调用calcPell(3)
,这会调用calcPell(4)
并且这会无限期地继续,因为只有calcPell(0)
和calcPell(1)
才会终止递归。
在the Wikipedia article about Pell numbers中,您可以看到正确的重复关系:
在您的实现中,您必须修复第二个return语句:
return 2 * calcPell(input - 1) + calcPell(input - 2);
答案 2 :(得分:1)
程序进行无限递归,如此行
return i = (2 * calcPell(input - 1) + calcPell(input + 1));
函数调用calcPell(input + 1)
将是无限的,因为没有定义上限