我有很多斐波那契数,如果我想确定两个斐波纳契数是否相邻,一个基本方法如下:
在第一步和第二步中,可能需要进行多次比较才能通过访问数组来获得正确的索引。
在第三步中,它需要一次减法和一次绝对操作。
我想知道是否存在另一种快速确定斐波纳契数相邻性的方法。
我不关心这个问题是否可以通过数学方法或任何黑客技术解决。
如果有人有任何想法,请告诉我。非常感谢!
答案 0 :(得分:5)
无需找到这两个数字的索引。
鉴于这两个数字属于Fibonacci系列,如果它们的差异大于min。其中有两个不相邻的数字。其他明智的他们是。
因为Fibonacci系列遵循以下规则:
F(n) = F(n-1) + F(n-2) where F(n)>F(n-1)>F(n-2).
So F(n) - F(n-1) = F(n-2) ,
=> Diff(n,n-1) < F(n-1) < F(n-k) for k >= 1
两个相邻的斐波那契数之间的差异总是小于它们中的最小数。
注意:仅当数字属于Fibonacci系列时才会成立。
答案 1 :(得分:0)
按Binet's formula,第n个斐波那契数约为sqrt(5)*phi**n
,其中phi
为黄金比例。您可以使用基本的phi对数来轻松恢复索引:
from math import log, sqrt
def fibs(n):
nums = [1,1]
for i in range(n-2):
nums.append(sum(nums[-2:]))
return nums
phi = (1 + sqrt(5))/2
def fibIndex(f):
return round((log(sqrt(5)*f,phi)))
测试一下:
for f in fibs(20): print(fibIndex(f),f)
输出:
2 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144
13 233
14 377
15 610
16 987
17 1597
18 2584
19 4181
20 6765
当然,
def adjacentFibs(f,g):
return abs(fibIndex(f) - fibIndex(g)) == 1
这与1,1
失败 - 但对于这样的边缘情况,明确测试特殊逻辑没有什么意义。如果你愿意,可以添加它。
在某个阶段,浮点舍入错误将成为一个问题。为此,您需要用整数日志算法(例如涉及二进制搜索的算法)替换math.log
。
在编辑:
我专注于如何恢复索引的问题(我将保留答案,因为这本身就是一个有趣的问题),但正如@LeandroCaniglia在他们出色的评论中所指出的那样,如果你们所有人都认为这是过度的我想要做的是检查两个Fibonacci数是否相邻,因为Binet公式的另一个结果是足够大的相邻Fibonacci数的比率与phi
相差一个可忽略不计的数量。你可以这样做:
def adjFibs(f,g):
f,g = min(f,g), max(f,g)
if g <= 34:
return adjacentFibs(f,g)
else:
return abs(g/f - phi) < 0.01
这假设它们确实是斐波纳契数。基于索引的方法可用于验证它们(计算索引,然后使用完整的Binet公式与该索引)。
答案 2 :(得分:0)
只需计算它们之间的差异。如果它小于它们相邻的2个数中的较小者,如果它更大,则它们不是。
Fibonacci序列a,b,c中的每个三元组符合规则
class SomeOtherClass{
private $variable;
public function publicMethod(){
$this->variable;
$this->privateMethod();
}
private function privateMethod(){
//
}
}
因此,对于每对相邻的Fibonaccis c = a + b
,它们之间的差异(x, y)
等于前一个Fibonacci的值,当然必须小于x。
如果2斐波纳契,即(y-x)
不相邻,则它们的差异必须大于两者中的较小者。至少,(如果它们是一个Fibonacci),差异将等于它们之间的斐波那契(当然更大比两个数字中的较小者一样)。
因为(a,b,c,d)
(x, z)