我正在尝试编写一个程序,使用以下公式查找任何给定数字的斐波纳契序列: 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))
答案 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来得到负数)