确定两个斐波那契数的邻接关系

时间:2016-10-02 15:02:25

标签: arrays algorithm numbers sequence

我有很多斐波那契数,如果我想确定两个斐波纳契数是否相邻,一个基本方法如下:

  1. 获取第一个斐波纳契数的索引,比如说i1
  2. 获取第二个斐波纳契数的索引,比如说i2
  3. 获取i1-i2的绝对值,即| i1-i2 | 如果值为1,则返回true。 否则返回false。
  4. 在第一步和第二步中,可能需要进行多次比较才能通过访问数组来获得正确的索引。

    在第三步中,它需要一次减法和一次绝对操作。

    我想知道是否存在另一种快速确定斐波纳契数相邻性的方法。

    我不关心这个问题是否可以通过数学方法或任何黑客技术解决。

    如果有人有任何想法,请告诉我。非常感谢!

3 个答案:

答案 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)