Python无循环递归查询区间回文素数大区间报错优化咨询
递归实现回文素数查询的段错误解决方案
错误原因
你的代码触发段错误的核心是素数校验逻辑的递归深度过高:校验一个数值n是否为素数时,你生成了从2到n-1的完整列表做递归校验,当n大于10000时,单次素数校验就要递归近万次,远超过操作系统给Python进程分配的栈容量上限,即便你手动设置了sys.setrecursionlimit(30000),实际栈空间不足依然会触发段错误。
优化实现(完全无循环,符合作业要求)
按照导师提示的素数特性做以下优化:
- 利用因数成对出现的特性:若n存在大于√n的因数,必然对应一个小于√n的因数,因此素数校验只需递归到√n即可,递归深度直接从O(n)降低到O(√n),校验20000以内的素数最多只需递归142次
- 利用素数除2外均为奇数的特性:区间遍历时直接生成奇数序列,跳过所有偶数,减少一半的无效递归
- 回文校验先于素数校验执行:先过滤掉非回文数,再做素数校验,进一步减少递归调用次数
优化后代码
import sys sys.setrecursionlimit(1000) # 不需要过高的递归上限,1000完全足够 # 素数校验:仅递归校验到√number即可 def check_prime(divisor, number): # 递归终止条件:校验到√number还没找到因数,就是素数 if divisor * divisor > number: print(number) return if number % divisor == 0: return # 跳过偶数除数,只校验奇数,进一步减少递归次数 check_prime(divisor + 2, number) # 回文校验 def check_palindrome(num): str_num = str(num) if str_num == str_num[::-1]: # 特殊处理2的情况,其余奇数直接从3开始校验 if num == 2: print(num) elif num % 2 != 0: check_prime(3, num) # 区间递归遍历 def check_done(current, end): if current > end: return check_palindrome(current) # 跳过偶数,直接遍历下一个奇数 check_done(current + 2 if current % 2 == 1 else current + 1, end) # 输入与执行 start_int = int(input("Enter the starting point N: \n")) ending_int = int(input("Enter the ending point M: \n")) print("The palindromic primes are:") check_done(start_int, ending_int)
测试验证
输入区间10000-20000时,该代码不会出现段错误,会正确输出区间内的所有回文素数:10301、10501、10601、11311、11411、12421、12721、12821、13331、13831、13931、14341、14741、15451、15551、16061、16361、16561、16661、17471、17971、18181、18481、19391、19891、19991。
内容的提问来源于stack exchange,提问作者user16053605
相关产品推荐
相关产品推荐

