繁体   English   中英

即使我返回了所有内容,我的代码的递归似乎也不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM