可删除素数是一个素数,可以按特定顺序删除其数字以始终创建素数,并最终以一位数素数结束。例如,3301
是一个可删除的素数,因为它可以像这样操作:3301 -> 331 -> 31 -> 3
。我试图在Python中编写一个递归函数,将可删除的素数的所有路径追溯到其单个数字根,但我完全被卡住了。它已经超出了我的头,我甚至无法遵循我自己的代码。该函数的期望输出的一个完整的例子是沿getTraces(3793)
回报[[3793, 373, 73, 7], [3793, 373, 73, 3], [3793, 373, 37, 7], [3793, 373, 37, 3], [3793, 379, 79, 7], [3793, 379, 79, 3], [3793, 379, 37, 7], [3793, 379, 37, 3]]
用于追踪可删除素数的递归函数 - Python 3
线的东西这里是我有功能的当前版本(如果有任何帮助)。我试图让它返回所有可能的路径到单个数字素数的列表,但是我无法将自己的头围绕递归思考,让它跟踪所有路径并将它们整齐地放在列表中:
def getTraces(prime):
paths = []
print("Parents: " + str(asc(prime)))
for p in asc(prime):
if len(str(p)) == 1:
print("One Digit Prime: "+ str(p))
return [p]
else:
traceArray = getTraces(p)
print("Trace: " + str(traceArray))
if traceArray != []:
for t in traceArray:
paths.append(str(prime) + ", " + str(p) + ", " + str(t))
#traceString = str(p) + ", " + str(traceArray)
return paths
此功能只返回一个主要的所有的家长名单(全部除去了一个数字可能的素数),并在getTraces()函数
def asc(prime):
adj = []
if(isPrime(prime)):
s = str(prime)
if len(s) == 1: return []
for i in range(0, len(s)):
num = int(s[:i] + s[i+1:])
if isPrime(num):
if not num in adj:
adj.append(num)
else:
print("That is not a prime number!")
return None
return adj
和一个非常好的工具使用我检查数字是否为素数的方法:
def isPrime(x):
if x <= 1: return False
for i in range(1, int(sqrt(x)) + 1):
if not gcd(i, x) == 1:
#print(i)
return False
return True
请给出[mcve]和更好的描述pro瑕疵比*“我有困难”* – jonrsharpe
@jonrsharpe编辑,我指定了为什么包括我目前的功能和我遇到的问题。这也是运行程序所需的最小代码量。 – kmecpp
*“我无法围绕必要的递归思维包裹我的头”*这不是一个真正的问题,不过,是吗? – jonrsharpe