考虑以下代码片段。
from typing import Iterable
def geometric_progression(
start: float, multiplier: float, num_elements: int
) -> Iterable[float]:
assert num_elements >= 0
if num_elements > 0:
yield start
yield from geometric_progression(
start * multiplier, multiplier, num_elements - 1
)
该函数返回几何级数中的第一个,以每次num_elements
开始start
并乘以。multiplier
很容易看出最后一个元素将通过一个 yield-statement 和num_elements-1
yield-from-statements 传递。该函数是否具有O(num_elements)
时间复杂度,或者它是否具有O(num_elements**2)
时间复杂度是由于深度为 0、1、2、...、...、...的嵌套 yield-from-statements 的“阶梯num_elements-2
” num_elements-1
?
编辑:我想出了一个更简单的代码片段来演示我在问什么。
from typing import Iterable, Any
def identity_with_nested_yield_from(depth: int, iterable: Iterable[Any]) -> Iterable[Any]:
assert depth >= 1
if depth == 1:
yield from iterable
else:
yield from identity_with_nested_yield_from(depth-1, iterable)
是这个功能O(depth + length of iterable)
,还是它O(depth * length of iterable)
?