使用带负数的递归的斐波那契序列

时间:2016-10-25 20:42:51

标签: python recursion fibonacci

我正在尝试编写一个程序,使用以下公式查找任何给定数字的斐波纳契序列: F -n =( - 1) n + 1 F n

我已经为正面编写了代码,但是当我输入负数时,我会得到不间断的递归。

def fib(n):
    if n > -1:
        if n == 0:
            return 0
        elif n == 1:
            return 1
        else:
            return fib(n-1) + fib(n-2)
    if n <= -1:
        return ((-1)**(n+1)) + fib(n)


num = eval(input("enter a number: "))
print("The value of the fibonacci series for the number", num, "is: ", fib(num))

3 个答案:

答案 0 :(得分:1)

对于消极方面,你的最后一个条款,你必须调用 fib(-n) n 的绝对值。

if n <= -1:
    return ((-1)**(n+1)) + fib(-n)   # Note the negation; abs(n) would also work.

如果你坚持直接计算,你需要保持关系:

f(n) = f(n-1) + f(n-2)

要为至少号码解决此问题:

f(n-2) = f(n) - f(n-1)

...然后规范化当前的负值:让j = n-2:

f(j) = f(j+2) - f(j+1)

你可以处理那里的变化吗?

答案 1 :(得分:0)

您的实施的if n <= -1:部分不正确,如果您查看wikipedia article,它会将否定推广显示为乘法,而不是添加:

return((-1)**n+1) * f(-n))

我已经考虑了@prune的修正,这应该在python中工作。我在R中测试了它,输出与维基百科文章中给出的序列相匹配。

答案 2 :(得分:0)

根据您提到的公式,返回语句((-1)**(n+1)) + fib(n)不正确

F(-n)=((-1)^ n + 1)* F(n)

计算机无法区分'-'符号和数字,它会计算一个负数(例如-3)作为整体文字(数字)。在方程式中,我们找到了F(n)的值,但是在您的return语句中,您找到了F(-n)的解。

对于实例,如果您采用n = -3,

F(-3)=((-1)^(-3 + 1))* F(-3)=>(-1)* F(-3)//根据您的return语句,系统无法评估RHS中的F(-3)。

正确的格式是 F(-3)=((-1)^(-3 + 1))* F(-(-3))=>(-1)* F(3)//因此,您必须取反递归前在RHS中为F(-3)。

因此,正确的陈述是((-1)**(n+1)) + fib(-n)

注意:RHS(右手边),求反(将数字乘以-1来得到负数)