【问题标题】:Find the first fibonacci number above 1 million找到第一个大于 100 万的斐波那契数
【发布时间】:2019-06-26 21:39:40
【问题描述】:

目前正在学习编程课程,并作为作业找到第一个超过一百万的斐波那契数,但我在找到特定数字时遇到了一些麻烦。我还应该找到第 n 个数字的索引,当它达到 100 万时。我对编码很陌生,但这是我迄今为止想出的,只是很难弄清楚如何实际计算数字。

我猜你会用一个while循环来切换for-但还没有弄清楚如何让它全部工作。

提前谢谢:)

def fib_seq(n):
    if n <= 2:
       return 1
    return fib_seq(n-1) + fib_seq(n-2)


lst = []
for i in range(1, 20):
    lst.append(i)
    print(fib_seq(i), lst)

【问题讨论】:

  • 好的,你已经完成了一半。您面临的确切问题是什么?我的意思是,将当前的斐波那契数与 100 万进行比较并不难
  • 所以你想找到低于 100 万的斐波那契?还是第一个超过百万的斐波那契?
  • 第一个斐波那契数超过一百万。我从测试中知道它是 1,346,269。就是不知道怎么计算

标签: python python-3.x fibonacci


【解决方案1】:

几点:

  • 您不需要建立一个列表。您只需要返回一个索引和相应的斐波那契数。

  • 斐波那契的递归算法不是最佳实践,除非您使用一些记忆。否则,必须一遍又一遍地重新计算相同的数字。请改用迭代方法。

这可能是这样的:

def fib(atleast):
    a = 0
    b = 1
    i = 1
    while b < atleast:
        a, b = b, a+b
        i += 1
    return i, b


print(fib(1000000)) # (31, 1346269) 

【讨论】:

  • 哦忘了补充它必须是一个递归函数。无法使用迭代
  • 递归函数对于 100 万用户来说不是一个好主意,因为您的代码将达到最大递归深度。请阅读this answer 了解为什么应该使用迭代。
  • 是的,经过一番挖掘,我自己发现了这一点,但在课程中,我们目前正在使用递归,我已经使用递归对其进行了编码
  • @trincot,它用于 OP。当然,你的答案是对的。
  • 非常感谢您的回答和建议 :)
【解决方案2】:

如果您需要通过一些递归查找来执行此操作,则应尽量避免每次迭代调用递归两次。这是一个复杂性爆炸的经典例子。一种方法是记住已经计算的结果。另一个是使用函数参数来维护状态。例如,这将提供答案并且只调用该函数 32 次:

def findIndex(v, prev = 0, current = 1, index = 0):
    if v < prev:
        return (prev, index)
    return findIndex(v, current, prev+current, index + 1 )


findIndex(1000000)  # (1346269, 31)

【讨论】:

  • 好的,谢谢!会看一下并尝试理解它。
猜你喜欢
  • 2016-01-25
  • 2016-02-17
  • 2014-02-22
  • 1970-01-01
  • 2022-12-10
  • 2021-09-03
  • 2016-11-28
  • 2015-04-17
  • 2014-08-07
相关资源
最近更新 更多