![](/img/trans.png)
[英]Can't understand why I am getting tuple error even though I typed everything correctly
[英]Recursion for my code doesn't seem to work even though I am returning everything
我正在编写代码来检查一个数字是否为素数,但我希望参数既是列表又是整数。 为此,我正在使用递归,但递归似乎不起作用。
def prime_checker(suspected_prime):
if type(suspected_prime) == type(list()):
result_list = list()
for x in range(len(suspected_prime)):
result_list.append(prime_checker(suspected_prime[x]))
return(result_list)
else:
prime_factor, factors, suspected_prime = 2, 0, abs(suspected_prime)
while factors < 1:
if suspected_prime % prime_factor == 0:
factors += 1
if math.ceil(suspected_prime**0.5) == prime_factor:
if factors == 0:
return True
else:
return False
prime_factor += 1
我认为这应该适用于您的代码:
def prime(suspected_prime):
if type(suspected_prime) == list:
result_list = list()
for x in suspected_prime:
result_list.append(prime(x))
return(result_list)
else:
factors,suspected_prime = 0,abs(suspected_prime)
root = int(suspected_prime**0.5)
for x in range (2,(root+1)):
if(factors == 1):
break
elif(suspected_prime%x == 0):
factors = 1
return False
if (factors == 0):
return True
如果需要,您可以根据需要更改 if-else 语句。
你的list
case 和int
case 都太复杂了,如果不坏的话,让我们看看我们能做些什么。 首先,使用isinstance
来测试类型。 接下来,您不需要遍历索引,您可以更轻松地遍历内容。
至于int
子句,您在知道答案后继续进行数学运算——当涉及到素数时,不要以这种方式浪费时间。 此外,如果我们将数字 2 及以下以及偶数视为特殊情况,并且只专注于测试奇数除数,则这种质数测试风格总是更简单:
def prime_checker(suspected_primes):
if isinstance(suspected_primes, list):
return [prime_checker(entity) for entity in suspected_primes]
suspected_prime = abs(suspected_primes)
if suspected_prime < 2:
return False
if suspected_prime % 2 == 0:
return suspected_prime == 2
for divisor in range(3, int(suspected_prime**0.5) + 1, 2):
if suspected_prime % divisor == 0:
return False
return True
print(prime_checker([1, [2, 3], 4, [5, 6, [7, 8], 9]]))
print(prime_checker(13))
输出
> python3 test.py
[False, [True, True], False, [True, False, [True, False], False]]
True
>
目前你有:
def prime-checker (input could be scalar or a list)
策略 1 :(删除素数检查器内部的循环,始终处理标量,即非列表)。 所以你有了 :
def prime_checker (scalar, ie. non-list input arg) :
要处理此问题,请将您的实现更改为始终处理标量。 在素数检查器函数之外进行外部循环。 有了这个,您的素数检查器将只有数学计算部分,因此它会更简单,更容易理解。
策略 2:或者,如果您坚持在素数检查器中保持列表循环。
情况 1:如果您的输入只是一个数字,例如 45。然后将输入 arg 发送为 [45] 因此,素数检查器的外部调用(来自外部调用者)将变为
results = prime_checker( [45])
情况 2:如果您的输入是一个列表,比如说 list1,那么您的调用是
results = prime_checker (list1).
所以,现在你的实现总是期望并处理一个列表。
# we always get input as a list (hence I changed the arg name)
def prime_checker(suspected_list):
# this branch *looks* recursive, but actually only handles a list
if (len(suspected_list) > 1) :
result_list = []
for prime_candidate in suspected_list:
result_list.append(prime_checker([prime_candidate]) # recur, as a list
return(result_list)
else: (when suspected list has only 1 entry)
# this branch does the actual prime calculation for a single input
suspected_prime = suspected_list[0]
prime_factor, factors, suspected_prime = 2, 0, abs(suspected_prime)
while factors < 1:
if suspected_prime % prime_factor == 0:
factors += 1
if math.ceil(suspected_prime**0.5) == prime_factor:
if factors == 0:
return True
else:
return False
prime_factor += 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.