首先,定义两个方便的函数(你可以自己做!):
def is_palindrome(number):
"""Whether the number is a palindrome."""
raise NotImplementedError
def reverse(number):
"""The number reversed, e.g. 79 -> 97."""
raise NotImplementedError
然后我们可以创建一个生成器来生成您描述的一系列数字:
def process(number):
"""Create the required series of numbers."""
while True:
yield number
if is_palindrome(number):
break
number += reverse(number)
例如:
>>> list(process(79))
[79, 176, 847, 1595, 7546, 14003, 44044]
# 0 1 2 3 4 5 6
确定一个数字是否是 Lychrel 数字比较棘手 - 很明显,当它不是时说出来是微不足道的,因为我们的生成器用完了:
def is_lychrel(number):
"""Whether the number is a Lychrel number."""
for _ in process(number):
pass
return False
你可以测试我们是否重复一个数字(如果有一个循环,它永远不会达到回文):
def is_lychrel(number):
"""Whether the number is a Lychrel number."""
seen = set()
for num in process(number):
if num in seen:
return True
seen.update((num, reverse(num))) # thanks @ReblochonMasque
return False
但否则它将继续,直到你的内存用完!