如何在c#中实现Pell数计算

时间:2014-05-21 10:30:56

标签: c#

我正在尝试计算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;
}

3 个答案:

答案 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中,您可以看到正确的重复关系:

Pell number recurrence relation

在您的实现中,您必须修复第二个return语句:

return 2 * calcPell(input - 1) + calcPell(input - 2);

答案 2 :(得分:1)

程序进行无限递归,如此行

return i = (2 * calcPell(input - 1) + calcPell(input + 1));

函数调用calcPell(input + 1)将是无限的,因为没有定义上限