小于数 k 的斐波那契数的个数。子 O(n)
Number of Fibonacci numbers smaller than number k. Sub O(n)
面试题:有多少斐波那契数小于给定数k?你能找到一个关于 k 的函数,得到小于 k 的斐波那契数吗?
示例:n = 6
答案:6 为 (0, 1, 1, 2, 3, 5)
很简单,写一个循环或使用斐波那契的递归定义。然而,这听起来太简单了……有没有办法使用封闭形式的定义来做到这一点? (https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression)
我认为至少可以很容易地看到这个数字的增长。由 Binet / De-Moivre formula、
fn = (φn - ψn) / 5
因为|ψ| < 1 < φ,则
fn∼φn / 5。
由此得出小于x的斐波那契数的数量增长为logφ(5x) .
这是一个闭式 Python 解,其复杂度为 O(1)。它使用 Binet 的公式(来自您链接到的维基百科文章):
>>> from math import sqrt,log
>>> def numFibs(n): return int(log(sqrt(5)*n)/log((1+sqrt(5))/2))
>>> numFibs(10)
6
哪些曲目有 1,1,2,3,5,8
关键是比奈公式中的第二项可以忽略不计,很容易将忽略它的结果取反
以上公式统计出小于或等于n
的斐波那契数的个数。每个新的斐波那契数都跳 1。因此,例如 numFibs(12) = 6
和 numFibs(13) = 7
。 13 是第 7 个斐波那契数,因此如果您想要 严格 小于 n
的斐波那契数的数量,您必须引入滞后。类似于:
def smallerFibs(n):
if n <= 1:
return 0
else:
return min(numFibs(n-1),numFibs(n))
现在 smallerFibs(13)
仍然是 6 但是 smallerFibs(14) = 7.
这当然仍然是 O(1)
.
面试题:有多少斐波那契数小于给定数k?你能找到一个关于 k 的函数,得到小于 k 的斐波那契数吗?
示例:n = 6
答案:6 为 (0, 1, 1, 2, 3, 5)
很简单,写一个循环或使用斐波那契的递归定义。然而,这听起来太简单了……有没有办法使用封闭形式的定义来做到这一点? (https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression)
我认为至少可以很容易地看到这个数字的增长。由 Binet / De-Moivre formula、
fn = (φn - ψn) / 5
因为|ψ| < 1 < φ,则
fn∼φn / 5。
由此得出小于x的斐波那契数的数量增长为logφ(5x) .
这是一个闭式 Python 解,其复杂度为 O(1)。它使用 Binet 的公式(来自您链接到的维基百科文章):
>>> from math import sqrt,log
>>> def numFibs(n): return int(log(sqrt(5)*n)/log((1+sqrt(5))/2))
>>> numFibs(10)
6
哪些曲目有 1,1,2,3,5,8
关键是比奈公式中的第二项可以忽略不计,很容易将忽略它的结果取反
以上公式统计出小于或等于n
的斐波那契数的个数。每个新的斐波那契数都跳 1。因此,例如 numFibs(12) = 6
和 numFibs(13) = 7
。 13 是第 7 个斐波那契数,因此如果您想要 严格 小于 n
的斐波那契数的数量,您必须引入滞后。类似于:
def smallerFibs(n):
if n <= 1:
return 0
else:
return min(numFibs(n-1),numFibs(n))
现在 smallerFibs(13)
仍然是 6 但是 smallerFibs(14) = 7.
这当然仍然是 O(1)
.