受 Quant Metropolis 答案的启发,这是我对在不同基础(从 2 到 10)中生成回文的看法。
首先,我们定义一个辅助生成器,它为我们提供所需长度的所有数字:
def nums_in_base(ndigits=3, b=10, _toplevel=True):
"""
generate all nubmers in the given base of the given length
`_toplevel` controls whether to add 0 at the beginning in the process of recursive calls
"""
if ndigits == 0:
yield ''
else:
for num in nums_in_base(ndigits-1, b, False):
for i in range(int(_toplevel), b):
yield str(i) + num
请注意,它返回字符串。
现在我们编写回文生成器本身:
def any_base_digit_palindromes(n_max_half_digits, b=10):
"""
generate all palindromes in the given base and
less than the given length
palindromes consist of two parts, `n_max_half_digits` controls
the maximum length of those halves
i.e., real max length of a palindrome is double the `n_max_half_digits`
"""
if n_max_half_digits > 1:
yield from digit_palindromes(n_max_half_digits - 1, b)
for num in nums_in_base(n_max_half_digits, b):
yield num + num[-2::-1]
yield num + num[::-1]
不确定 big-O,但对于所有小于 1,000,000 的以 10 为底的回文数,我与 OP 的版本进行了简单的经验比较,我的 OP 版本约为 400 毫秒,我的版本约为 0.7 毫秒。
PS 这可以扩展到高于 10 的基数,但这需要在两个生成器中使用明确的预定义数字数组而不是范围。