【问题标题】:Implementing alternative Fibonacci sequence实现替代斐波那契数列
【发布时间】:2020-09-29 22:37:27
【问题描述】:

所以我正在为问题 3 苦苦挣扎。我认为 L 的表示将是一个类似这样的函数:

import numpy as np
def L(a,  b):
    #L is 2x2 Matrix, that is 
    return(np.dot([[0,1],[1,1]],[a,b]))


def fibPow(n):
    if(n==1):
        return(L(0,1))
    if(n%2==0):
        return np.dot(fibPow(n/2), fibPow(n/2))
    else:
        return np.dot(L(0,1),np.dot(fibPow(n//2), fibPow(n//2)))

鉴于 b 我很确定我错了。我应该做什么?任何帮助,将不胜感激。我不认为我应该使用斐波那契数列的黄金比例属性。我的 a 和 b 应该是什么?

编辑:我已经更新了我的代码。由于某种原因,它不起作用。 L 会给我正确的答案,但我的幂运算似乎是错误的。谁能告诉我我做错了什么

【问题讨论】:

  • 问题不够清楚,能否附上完整问题的图片?
  • 这是完整的问题。是不是质量不好
  • 虽然在这种情况下已经很清楚了,但f 并没有在该图像中定义。

标签: python-3.x algorithm fibonacci


【解决方案1】:

使用经过编辑的代码,您就快到了。只是不要把所有东西都塞进一个函数中。这会导致细微的错误,我认为您可能会喜欢发现这些错误。

现在,L 不起作用。正如我之前所说,它是一个矩阵。问题的核心是计算它的nth 幂。考虑

L = [[0,1], [1,1]]

def nth_power(matrix, n):
    if n == 1:
        return matrix
    if (n % 2) == 0:
        temp = nth_power(matrix, n/2)
        return np.dot(temp, temp)
    else:
        temp = nth_power(matrix, n // 2)
        return np.dot(matrix, np.dot(temp, temp))

def fibPow(n):
    Ln = nth_power(L, n)
    return np.dot(L, [0,1])[1]

nth_power 与您的方法几乎相同,只是进行了一些微不足道的优化。您可以通过消除递归来进一步优化它。

【讨论】:

  • @pasha 考虑维度。在您的实现中,fibPow 的基本情况返回一个向量 (1x2)。两个这样的向量的np.dot 返回一个标量。
【解决方案2】:

首先,没有L(n, a, b)。只有L(a, b),一个定义明确的线性算子,它将向量a, b 转换为向量b, a+b

现在有个很大的提示:线性运算符是一个矩阵(在本例中为 2x2,非常简单)。你能拼出来吗?

现在,通过矩阵魔法将这个矩阵n 连续应用于初始向量(在本例中为0, 1)相当于应用nL 的次方一次 到初始向量。这就是问题 2 的内容。

一旦你确定了这个矩阵的样子,fibPow 就减少到计算它的n 次方,并将结果乘以0, 1。要获得O(log n) 的复杂性,请查看平方乘幂。

【讨论】:

  • 矩阵的东西是我错过的。非常感谢。
  • 嘿,我更新了这个问题。你觉得你能告诉我我做错了什么吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2013-08-03
  • 2014-05-19
  • 2015-08-30
  • 2013-03-14
相关资源
最近更新 更多