# Авторский учебный пример Академии С. Python 3. from functools import lru_cache # В примере: положительные числа и только команды +1, *2. @lru_cache(maxsize=None) def ways(x, target, blocked=-1): if x > target or x == blocked: return 0 if x == target: return 1 return ways(x + 1, target, blocked) + ways(x * 2, target, blocked) print(ways(2, 10)) # 7 print(ways(2, 6) * ways(6, 10)) # 3: обязательно через 6 print(ways(2, 10, blocked=5)) # 3: не заходя в 5 start, target = 2, 10 count = {x: 0 for x in range(start, target + 1)} count[start] = 1 for x in range(start, target + 1): for next_x in (x + 1, x * 2): if next_x <= target: count[next_x] += count[x] print(count[target]) # 7