Python 直接计算第n个Fibonacci项,而不使用binet'查找以前的项;s公式。(在O(1)时间内)
上述代码不正确,它给出了一些更接近fib_n的值Python 直接计算第n个Fibonacci项,而不使用binet'查找以前的项;s公式。(在O(1)时间内),python,algorithm,fibonacci,fibonacci-heap,Python,Algorithm,Fibonacci,Fibonacci Heap,上述代码不正确,它给出了一些更接近fib_n的值 from math import sqrt n = int(input()) phi = (1 + sqrt(5))/2 fib_n = round((phi**n)) print(fib_n) 这段代码在第6行除以sqrt(5)后工作得非常完美 我的疑问是: 除以sqrt(5)的意义是什么?为什么只有sqrt(5)而没有任何其他数字 我可以用地板或天花板(或任何其他)来解决同样的问题,而不需要除以根(5)吗 非常感谢您提供的任何帮助/指
from math import sqrt
n = int(input())
phi = (1 + sqrt(5))/2
fib_n = round((phi**n))
print(fib_n)
这段代码在第6行除以sqrt(5)后工作得非常完美
我的疑问是:
from math import sqrt
n = int(input())
phi = (1 + sqrt(5))/2
fib_n = round((phi**n)/sqrt(5))
print(fib_n)
sqrt(5)来自证明:
基本上,sqrt(5)来自解部分分数
旁注:pow(φ,n)通常比φ**n更有效,它还可以计算MOD。功率(φ,n,m)给出(φ**n)%m+1您给出的是正确的数学公式。但是,请注意,当n变大时,pow(phi2,n)非常接近于0,因此,对于较大的n,使用round(pow(phi1,n))/sqrt(5)近似它也会得到正确的结果。对于较小的n,这恰好也给出了正确的结果,所以在实践中,这是可以使用的。看。既然OP提到了比奈公式,取整版本就是OP想要的。@justhalf@mattyx17
(phi**n)/sqrt(5)
总是给出正确的答案吗?因为它显示n>=71的偏差。@hack3r_0m(φ**n)/sqrt(5)
是一个近似值。正确的数学公式是(((1+sqrt(5))/2)**n)+((1-sqrt(5))/2)**n))/sqrt(5)
。正如@justhalf所提到的,((1-sqrt(5))/2)**n变为0,因为n变大,所以在某些情况下被忽略round(phi**5)
为11。它既不是“正确的谎言-1”也不是“正确的谎言+1”。@PaulHankin我编辑过它
from math import sqrt
n = int(input())
phi1 = (1 + sqrt(5))/2
phi2 = (1 - sqrt(5))/2
fib_n = (pow(phi1, n) - pow(phi2, n)) / sqrt(5)
print(fib_n)