【问题标题】:How to define a variable by an equation containing it? (Python)如何通过包含变量的方程定义变量? (Python)
【发布时间】:2018-07-28 21:14:29
【问题描述】:

我正在解决一个问题,我必须打印所有斐波那契数,这样:

a <= f <= b

我想以大于或等于 a 的最小斐波那契数开始它们,以使我的程序运行得更快。为此,我需要定义一个变量“n”,以便第 n 个斐波那契数满足上述条件(大于或等于 a 的最小数)。要定义这样的变量,我需要找到满足 fibonacci(n) 一般项方程的最小“n”。

我试图通过创建一个 for 循环来找到它,但它最终就像我从第一个斐波那契数开始检查一样慢。有人对如何有效地定义它有任何想法吗?

附:这是我尝试的代码:

from math import sqrt, log, ceil

def Fibo(n):
    if n == 1: return 1
    elif n == 2: return 2
    return Fibo(n-1) + Fibo(n-2)


while True:
    try:
        a, b = [int(i) for i in input().split()]
        cont = 0

        phi = (sqrt(5) + 1) / 2
        i = ceil(log(a * sqrt(5), phi))
        if Fibo(i-1) >= a: i -= 1
        elif Fibo(n) < a: i += 1

        while True:
            if a <= Fibo(i) <= b: cont += 1
            elif Fibo(i) > b:
                break
            i -= 1

        print(cont)
    except input() == "0 0":
        break

【问题讨论】:

  • 当然,您只需要以非慢速方式计算斐波那契数即可。
  • 计算第n个斐波那契数有一个固定时间公式:stackoverflow.com/a/19892721/125816
  • 所以你想要一个更快的解决方案,但比什么更快?你还没有展示你的尝试。
  • 这是 URI 问题 1722。我的程序是 4s 运行的,所以它不符合 1s 的时间限制。这是我的代码:repl.it/@MateusBuarque/URI-1722@MrT

标签: python math optimization


【解决方案1】:

对于F(n)nth 斐波那契数,可能最有用的公式是

from math import sqrt

phi = (sqrt(5) + 1) / 2  # the golden ratio
F(n) = round(phi**n / sqrt(5))

因此,对于给定的a 值,获取n 值的公式是

from math import sqrt, log, ceil

phi = (sqrt(5) + 1) / 2  # the golden ratio
n = ceil(log(a * sqrt(5), phi))

由于近似值和舍入问题,您应该检查n-1nn+1 的值,以确保您获得了所需的值。如果您经常这样做,您应该预先定义保持黄金比例和五的平方根值的变量。如果a 的值太大,float 类型无法准确存储它,则需要更复杂的例程来处理更大的数字。

【讨论】:

  • @MateusBuarque:在这个网站上,通过投票所有有用的答案来表达你的感激之情。如果您有足够的声誉,您可以通过单击答案左上角的向上箭头来执行此操作。 (您还没有足够的声誉来执行此操作。)此外,通过单击答案左上角附近的复选标记来接受最佳答案(如果它确实回答了您的问题)。这比在评论中说谢谢要好。它还可以帮助其他人看到您的问题已得到解答。
猜你喜欢
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2023-03-10
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多