Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 确定两个斐波那契数的邻接_Arrays_Algorithm_Numbers_Sequence - Fatal编程技术网

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

Arrays 确定两个斐波那契数的邻接,arrays,algorithm,numbers,sequence,Arrays,Algorithm,Numbers,Sequence,我有很多fibonacci数,如果我想确定两个fibonacci数是否相邻,一个基本方法如下: 获取第一个斐波那契数的索引,比如i1 得到第二个斐波那契数的索引,比如i2 得到i1-i2的绝对值,即| i1-i2| 如果该值为1,则返回true。 否则返回false 在第一步和第二步中,可能需要多次比较才能通过访问数组获得正确的索引 在第三步中,它需要一个减法运算和一个绝对运算 我想知道是否存在另一种快速确定斐波那契数邻接的方法 我不在乎这个问题是否可以通过数学或任何黑客技术来解决 如果有人有什

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

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

    在第三步中,它需要一个减法运算和一个绝对运算

    我想知道是否存在另一种快速确定斐波那契数邻接的方法

    我不在乎这个问题是否可以通过数学或任何黑客技术来解决

    如果有人有什么想法,请告诉我。非常感谢

    By,第n个斐波那契数约为
    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个斐波那契数字。对于较大的,计算最大Fibonacci
    F
    的商
    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