from typing import Callable, Iterator def unfold[T](k: T, f: Callable[[T], T]) -> Iterator[T]: """ Unfold a sequence from an initial value. Unfold creates a (potentially infinite) sequence by continuously applying f to k, and storing the result back in k. Iteration is interrupted when f raises StopIteration. The initial k is always present in the resulting sequence. """ yield k while True: try: k = f(k) except StopIteration: break else: yield k def next_collatz(n): if n <= 1: raise StopIteration() elif n % 2 == 0: return n // 2 else: return n * 3 + 1 initial = int(input()) unfold_collatz = unfold(initial, next_collatz) print(list(unfold_collatz))
119
[119, 358, 179, 538, 269, 808, 404, 202, 101, 304, 152, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]