这是在python中计算Fibonacci系列的迭代版本:
<img src="{{asset('storage/image.jpg')}}">
这是递归版本:
def fib_iterative(n):
if n == 0:
return []
if n == 1:
return [1]
if n == 2:
return [1,1]
fib_list = [1,1]
for i in range(0,n):
fib_list.append(fib_list[i]+fib_list[i+1])
return fib_list
每个人的Big-O是什么?
调用fib_numbers_in_list(n)和fib_iterative(n)来返回列表中的前n个Fibonacci数。
有没有办法可以找到一个O(log n)算法来生成n个Fibonacci数?
答案 0 :(得分:1)
def fib_iterative(n): if n == 0: return [] if n == 1: return [1] if n == 2: return [1,1] fib_list = [1,1] for i in range(0,n): fib_list.append(fib_list[i]+fib_list[i+1]) return fib_list
此函数有一个for循环,重复n
次。
这使得函数O(n)
具有时间复杂性。
def fib_recursive(n): if n == 1: return 1 elif n == 2: return 1 else: return fib(n-1) + fib(n-2) def fib_numbers_in_list(n): fibn = [] for x in range(1,n+1): fibn.append(fib_recursive(x)) return fibn
我认为在代码中调用fib(n-1) + fib(n-2)
时出错。我认为这应该是fib_recursive(n-1) + fib_recursive(n-1)
。
我们假设fib_recursive(n)
有f(n)
计算要做。估算它的简单方程是f(n) = f(n-1) + f(n-2)
。边界条件为f(2) = 1, f(1) = 1
。这对你很熟悉吧?递归代码的时间复杂度最终与输入n的斐波纳契数相同。
就像你可能已经知道的那样,第n个斐波纳契数与(2.736) ** n
成正比。这使得递归函数的时间复杂度为O(2.736 ** n)
。 (如果您想了解更多相关信息,请访问http://mathworld.wolfram.com/FibonacciNumber.html)
好吧,我们还没有完成。我们必须将其乘以n
,因为您希望知道从1
到n
的所有斐波纳契数。所以慷慨的计算会得到答案O(n * 2.736 ** n)
答案 1 :(得分:0)