Рассмотрим следующий фрагмент кода.
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
прогрессии геометрии c, начиная с start
и умножая на multiplier
каждый раз. Легко видеть, что последний элемент будет пропущен через один оператор yield и num_elements-1
yield-from-операторов. Имеет ли эта функция O(num_elements)
временную сложность или O(num_elements**2)
временную сложность из-за "лестницы" вложенных операторов yield-from-глубин 0, 1, 2, ..., 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)