【发布时间】:2021-06-07 05:09:26
【问题描述】:
我需要使用递归函数来查找作为输入提供的两个整数 N、M 之间的所有回文素数。 (包括起点和终点)。
- 回文数是从正面和背面读取相同的数字。 例如:212、44、9009、4567654。
- 要计算一个数字是否是回文,请将您的答案合并到 问题 1。
- 素数是大于 1 且只能被 1 和自身整除的数。
例如:3、11、313。
回文素数的一些例子是:11、191、313。
你可以假设总是 N>1,并且 N≤M。
您不得在程序中使用任何形式的循环!
我在下面包含了我的代码,想知道是否可以对其进行检查,如果可以,您能否解释一下我如何使它更简单或更高效。(您是否也可以包括 cmets 来解释不同的代码行? )
import sys
sys.setrecursionlimit (30000)
def palindromeprimes(M,N,lst):
def pr_num(point,end = 1):
if end == point:
return True
else:
if point % end == 0 and end != 1:
return False
else:
return pr_num(point, end + 1)
def reverse(sub_phrase):
if sub_phrase == "":
return sub_phrase
else:
return reverse(sub_phrase[1:]) + sub_phrase[0]
if M >=N:
if pr_num(M,1):
if M==int(reverse(str(M))):
lst.append(M)
palindromeprimes (M-1,N,lst)
lst = []
N = eval(input("Enter the starting point N: \n"))
M = eval(input("Enter the ending point M: \n"))
print ("The palindromic primes are:")
palindromeprimes(M,N,lst)
array1 = sorted(lst)
def printlst(array1,pos=0):
if pos<len(array1):
print(array1[pos])
return printlst(array1,pos+1)
printlst(array1,0)
样本输入/输出:
Enter the starting point N:
200
Enter the ending point M:
800
The palindromic primes are:
313
353
373
383
727
757
787
797
【问题讨论】:
-
分析代码的一个好方法是找出你的时间在运行时间和内存方面的复杂性,也许你可以从那里开始看看你的算法是否足够好,然后再重构代码让它看起来更干净更简单。较短的代码通常更好,但并非总是如此。
-
一个写着“你不能在你的程序中使用任何形式的循环”的作业显然不关心效率。
-
另外这类问题更适合 [code-review]。
-
任何原因,为什么您在收集输入时使用 eval 函数?
-
永远不要在用户输入中使用
eval,除非您愿意让任何用户有机会在您的计算机上安装恶意软件!
标签: python recursion primes palindrome