Кажется, что рекурсия для моего кода не работает, хотя я все возвращаю - PullRequest
0 голосов
/ 16 февраля 2020

Я делаю код, чтобы проверить, является ли число простым или нет, но я хочу, чтобы аргумент был и списком, и целым числом. Для этого я использую рекурсию, но рекурсия, похоже, не работает.

 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 

Ответы [ 3 ]

0 голосов
/ 17 февраля 2020

И ваш list кейс, и int кейс слишком сложны, если не сломаны, давайте посмотрим, что мы можем сделать. Сначала используйте isinstance для проверки типов. Далее вам не нужно l oop над индексами, вы можете легче l oop над содержимым.

Что касается предложения 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
>
0 голосов
/ 17 февраля 2020

В настоящее время у вас есть:

def prime-checker (input could be scalar or a list)

Стратегия 1: (Удалите зацикливание внутри главной проверки, всегда работайте со скаляром, то есть не со списком). поэтому у вас есть:

def prime_checker (scalar, ie. non-list input arg) :

Чтобы справиться с этим, измените вашу реализацию, чтобы всегда обрабатывать скаляр. Делайте петли снаружи, вне функции первичной проверки. При этом у вашего прайм-чекера будет только математическая часть вычисления, поэтому он будет проще и понятнее.

Стратегия 2: Альтернативно, если вы настаиваете на том, чтобы держать список в цикле прайм-проверки.

Случай 1: если ваш ввод - просто число, скажем, 45. Затем отправьте входной аргумент как [45]. Таким образом, внешний вызов Prime-Checker (от внешнего абонента) станет

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 
0 голосов
/ 16 февраля 2020

Я думаю, это должно работать для вашего кода:

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 в соответствии с вашими требованиями, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...