mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-30 16:31:08 +00:00
39 lines
966 B
Python
39 lines
966 B
Python
|
from collections.abc import Iterator
|
||
|
|
||
|
|
||
|
def lexical_order(max_number: int) -> Iterator[int]:
|
||
|
"""
|
||
|
Generate numbers in lexical order from 1 to max_number.
|
||
|
|
||
|
>>> " ".join(map(str, lexical_order(13)))
|
||
|
'1 10 11 12 13 2 3 4 5 6 7 8 9'
|
||
|
>>> list(lexical_order(1))
|
||
|
[1]
|
||
|
>>> " ".join(map(str, lexical_order(20)))
|
||
|
'1 10 11 12 13 14 15 16 17 18 19 2 20 3 4 5 6 7 8 9'
|
||
|
>>> " ".join(map(str, lexical_order(25)))
|
||
|
'1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 3 4 5 6 7 8 9'
|
||
|
>>> list(lexical_order(12))
|
||
|
[1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9]
|
||
|
"""
|
||
|
|
||
|
stack = [1]
|
||
|
|
||
|
while stack:
|
||
|
num = stack.pop()
|
||
|
if num > max_number:
|
||
|
continue
|
||
|
|
||
|
yield num
|
||
|
if (num % 10) != 9:
|
||
|
stack.append(num + 1)
|
||
|
|
||
|
stack.append(num * 10)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
from doctest import testmod
|
||
|
|
||
|
testmod()
|
||
|
print(f"Numbers from 1 to 25 in lexical order: {list(lexical_order(26))}")
|