Arrays 确定两个斐波那契数的邻接
我有很多fibonacci数,如果我想确定两个fibonacci数是否相邻,一个基本方法如下:Arrays 确定两个斐波那契数的邻接,arrays,algorithm,numbers,sequence,Arrays,Algorithm,Numbers,Sequence,我有很多fibonacci数,如果我想确定两个fibonacci数是否相邻,一个基本方法如下: 获取第一个斐波那契数的索引,比如i1 得到第二个斐波那契数的索引,比如i2 得到i1-i2的绝对值,即| i1-i2| 如果该值为1,则返回true。 否则返回false 在第一步和第二步中,可能需要多次比较才能通过访问数组获得正确的索引 在第三步中,它需要一个减法运算和一个绝对运算 我想知道是否存在另一种快速确定斐波那契数邻接的方法 我不在乎这个问题是否可以通过数学或任何黑客技术来解决 如果有人有什
sqrt(5)*phi**n
,其中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在他们的精彩评论中指出的那样,如果你只想检查两个斐波那契数是否相邻,这就太过分了,因为比奈公式的另一个结果是足够大的相邻斐波那契数的比率与φ的差异可以忽略不计。你可以这样做:
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
def adjFibs(f,g):
f、 g=最小值(f,g),最大值(f,g)
如果g则无需找到这两个数字的索引。
假设这两个数属于斐波那契数列,如果它们之间的差值大于它们之间的最小数,则这两个数不相邻。另一方面,他们很聪明
因为斐波那契级数遵循以下规则:
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
F(n)=F(n-1)+F(n-2),其中F(n)>F(n-1)>F(n-2)。
所以F(n)-F(n-1)=F(n-2),
=>k>=1时的差值(n,n-1)
两个相邻fibonaci数之间的差值将始终小于它们之间的最小数
注:只有当数字属于斐波那契数列时,此项才有效 只需计算它们之间的差异。如果它小于它们相邻的两个数字中的较小者,如果它较大,则它们不是
斐波那契序列a、b、c中的每个三元组都符合这个规则
c = a + b
因此,对于每一对相邻的Fibonaccis(x,y)
,它们之间的差值(y-x)
等于前面Fibonacci的值,当然必须小于x
如果两个fibonacci,比如说(x,z)
不相邻,那么它们的差值必须大于两者中的较小者。至少,(如果它们相距一个斐波那契),差值等于它们之间的斐波那契(当然大于两个数字中的较小者)
因为(a,b,c,d)
你有多少斐波那契数?我很好奇,因为斐波那契是一个增长非常快的序列。如果你确定这些数字实际上是斐波那契序列的成员,请检查分数是否在0.6到1.7之间。使用你的方法计算前10个斐波那契数字。对于较大的,计算最大FibonacciF
的商F/F
与较小的F
之间的距离(即其差值的绝对值),以及数字phi=(1+sqrt(5))/2
。如果距离|F/F-phi |
小于,比如说0.01
,则它们是连续的,否则它们不是连续的(正如@LuzL所说,只要它们都是斐波那契数)。相邻的斐波那契数的差值等于先前的斐波那契数。如果它们不是相邻的,那么它们之间的差值至少应该大于这个值(如果它们之间仅由另一个斐波那契数分隔),即它们之间的斐波那契数。因此,只需看看这两个数字之间的差异。如果差异小于两者,则它们是相邻的。如果不是,那么就不是。你可以用这个来获取数字的索引,或者你可以保持数字的顺序,使数组中的索引对应于序列中的索引,并在那里进行二进制搜索,或者最好使用一个字典,其中键是斐波那契数,值是它的索引。很多时候,它需要一次减法和一次比较。确定两者中的最小值需要一些其他计算,但我认为这已经足够好了。
since c= a+b
and d = b+c
then d-b = (b+c) - b = c