同步操作将从 编程语言算法集/Python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
# fibonacci.py"""Calculates the Fibonacci sequence using iteration, recursion, and a simplifiedform of Binet's formulaNOTE 1: the iterative and recursive functions are more accurate than the Binet'sformula function because the iterative function doesn't use floatsNOTE 2: the Binet's formula function is much more limited in the size of inputsthat it can handle due to the size limitations of Python floats"""from math import sqrtfrom time import timedef time_func(func, *args, **kwargs):"""Times the execution of a function with parameters"""start = time()output = func(*args, **kwargs)end = time()if int(end - start) > 0:print(f"{func.__name__} runtime: {(end - start):0.4f} s")else:print(f"{func.__name__} runtime: {(end - start) * 1000:0.4f} ms")return outputdef fib_iterative(n: int) -> list[int]:"""Calculates the first n (0-indexed) Fibonacci numbers using iteration>>> fib_iterative(0)[0]>>> fib_iterative(1)[0, 1]>>> fib_iterative(5)[0, 1, 1, 2, 3, 5]>>> fib_iterative(10)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]>>> fib_iterative(-1)Traceback (most recent call last):...Exception: n is negative"""if n < 0:raise Exception("n is negative")if n == 0:return [0]fib = [0, 1]for _ in range(n - 1):fib.append(fib[-1] + fib[-2])return fibdef fib_recursive(n: int) -> list[int]:"""Calculates the first n (0-indexed) Fibonacci numbers using recursion>>> fib_iterative(0)[0]>>> fib_iterative(1)[0, 1]>>> fib_iterative(5)[0, 1, 1, 2, 3, 5]>>> fib_iterative(10)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]>>> fib_iterative(-1)Traceback (most recent call last):...Exception: n is negative"""def fib_recursive_term(i: int) -> int:"""Calculates the i-th (0-indexed) Fibonacci number using recursion"""if i < 0:raise Exception("n is negative")if i < 2:return ireturn fib_recursive_term(i - 1) + fib_recursive_term(i - 2)if n < 0:raise Exception("n is negative")return [fib_recursive_term(i) for i in range(n + 1)]def fib_binet(n: int) -> list[int]:"""Calculates the first n (0-indexed) Fibonacci numbers using a simplified formof Binet's formula:https://en.m.wikipedia.org/wiki/Fibonacci_number#Computation_by_roundingNOTE 1: this function diverges from fib_iterative at around n = 71, likelydue to compounding floating-point arithmetic errorsNOTE 2: this function doesn't accept n >= 1475 because it overflowsthereafter due to the size limitations of Python floats>>> fib_binet(0)[0]>>> fib_binet(1)[0, 1]>>> fib_binet(5)[0, 1, 1, 2, 3, 5]>>> fib_binet(10)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]>>> fib_binet(-1)Traceback (most recent call last):...Exception: n is negative>>> fib_binet(1475)Traceback (most recent call last):...Exception: n is too large"""if n < 0:raise Exception("n is negative")if n >= 1475:raise Exception("n is too large")sqrt_5 = sqrt(5)phi = (1 + sqrt_5) / 2return [round(phi ** i / sqrt_5) for i in range(n + 1)]if __name__ == "__main__":num = 20time_func(fib_iterative, num)time_func(fib_recursive, num)time_func(fib_binet, num)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。