【发布时间】:2017-09-15 19:53:18
【问题描述】:
我正在尝试解决一个问题,部分解决方案是找到小于输入数字的 finbonacci 数字的总和。现在输入数字的上限是10**9。我已将问题简化为以下 O(n) 解决方案,我想知道是否有更有效的解决方案。
b=[1, 2, 4, 7, 12, 20, 33, 54, 88, 143, 232, 376, 609, 986, 1596, 2583, 4180, 6764,
10945, 17710, 28656, 46367, 75024, 121392, 196417, 317810, 514228, 832039,
1346268, 2178308, 3524577, 5702886, 9227464, 14930351, 24157816,
39088168, 63245985, 102334154, 165580140, 267914295, 433494436, 701408732, 1134903169, 1836311902]
def test_lambda(a):
list_numbers= filter(lambda x: x<=a, b)
return len(list_numbers)
如您所见,我将列表 b 的值与给定输入进行比较,并返回小于给定数字的元素。
b 是该索引之前的斐波那契数之和的列表,所以第一个数是 1,总和是 1,第二个是 1,总和是 2,第三个是 2,总和是 4...
【问题讨论】:
-
你知道有一个小于 O(n) 的解,还是你只想要一个?
-
只用二分查找...
-
不知道有没有小于O(n)的解...
-
@fazkan 我唯一能想到的就是使用第 n 个元素的公式:math.hmc.edu/funfacts/ffiles/10002.4-5.shtml
-
前n个斐波那契数的和是fib(n+2)-1。至于有效地找到给定数字最近的斐波那契数,请参阅stackoverflow.com/a/40683466/4014959
标签: python algorithm lambda functional-programming