Python嵌套for循环输出无序?欧拉项目第4题代码疑问
为什么你的Python代码没先输出最大回文数?
嘿,这个问题我太能理解了!当初刚学Python循环的时候也踩过类似的坑,我来给你掰扯清楚~
问题出在遍历顺序和输出逻辑上
你写的Python代码是把所有符合条件的三位数乘积回文数都打印出来,而打印的顺序完全跟着双重循环的遍历走:
- 先把
x=999时,y从999一直降到101的所有乘积都检查一遍,碰到回文数就打印; - 然后轮到
x=998,同样把y从999降到101的乘积全检查一遍,有回文数就打印; - 以此类推,直到
x=101。
而最大的回文数906609是993 × 913,这个组合要等到x=993的时候才会被遍历到。在这之前,x=999到x=994的循环里,已经有其他回文数(比如580085=995×583)被找到并打印了,所以906609自然会出现在输出的后面。
为什么你觉得C语言代码会先输出最大数?
大概率是你的C语言代码逻辑和Python版本不一样!比如:
- 可能C语言代码是找到一个回文数后就立刻终止循环(比如找到当前
x对应的最大回文数就break,然后只保留最大的那个最后输出); - 或者C语言代码并没有打印所有回文数,而是只记录遍历过程中找到的最大值,最后只输出这个最大值。
而你的Python代码是毫无筛选地打印所有符合条件的结果,所以顺序完全是遍历的先后顺序,和数值大小无关。
怎么修改Python代码,让它优先找到最大回文数?
如果你的目标是找到最大的那个回文数,而不是打印所有,我们可以优化代码逻辑,避免无效遍历,同时直接定位到最大值:
def find_largest_palindrome(): max_pal = 0 # 外层循环从999递减到100 for x in range(999, 100, -1): # 优化:如果当前x的平方都比已找到的最大值小,后面的x乘任何y都不可能更大,直接终止外层循环 if x * x < max_pal: break # 内层循环从x开始,避免重复计算x*y和y*x(比如993×913和913×993是同一个数) for y in range(x, 100, -1): product = x * y # 如果当前乘积已经比最大值小,后面的y更小,乘积只会更小,直接终止内层循环 if product < max_pal: break # 判断是否是回文数 if str(product) == str(product)[::-1]: max_pal = product break # 当前x对应的最大回文数就是这个,不用继续找更小的y了 print(max_pal) find_largest_palindrome()
这个优化后的代码会直接输出906609,而且遍历效率高很多,因为它避免了大量无效的计算和检查。
内容的提问来源于stack exchange,提问作者Tanay Roman




