可刪除素數是一個素數,可以按特定順序刪除其數字以始終創建素數,並最終以一位數素數結束。例如,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