【发布时间】:2021-06-03 21:52:35
【问题描述】:
我知道我的 Python Fibonacci 算法的简单版本的时间复杂度为 O(2^n)^2:
def fibonacci_naive(n):
if n < 0:
return None
if n == 0 or n == 1:
return 0
if n == 2:
return 1
return fibonacci_naive(n - 1) + fibonacci_naive(n - 2)
我正在尝试编写另一个斐波那契递归,但复杂度为 O(n)。到目前为止,我可以想到如何用一个简单的for 循环来做到这一点,但我无法将我的头转向如何将它变成一个递归函数。任何帮助表示赞赏!
def fibonacci_fast(n):
if n < 0:
return None
if n == 0 or n == 1:
return 0
if n == 2:
return 1
fn_minus_2 = 0
fn_minus_1 = 1
for _ in range(2, n+1):
temp = fn_minus_2 + fn_minus_1
fn_minus_2 = fn_minus_1
fn_minus_1 = temp
return fn_minus_1
def fibonacci_fast(n, fn_minus_1=1, fn_minus_2=0):
if n < 0:
return None
if n == 0 or n == 1:
return 0
if n == 2:
return 1
return fibonacci_fast(???)
【问题讨论】:
-
斐波那契数列是为什么不使用递归并在实施前思考的主要示例之一。只需重复将最后两项相加即可轻松计算出序列,而某些定义可能会导致您从另一个方向进入更复杂的解决方案,包括完全成长的递归树。
-
我认为你不能。您可以使用 memoizing 来缓存已计算的值并防止递归调用,但最好不要使用递归。
-
@NobbyNobbs 你绝对可以,你必须使用递归作为一个迭代过程
-
顺便说一句,复杂度是 O(phi^n) IIRC。
标签: python recursion fibonacci