Выполнить рекурсивный выход из функции при выполнении условия? - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь решить эту проблему в Python: «Напишите функцию, возвращающую True, если ее аргумент является массивом, имеющим те же структуры вложенности и ту же соответствующую длину вложенных массивов, что и первый массив».

Итак, я хочу сравнить 2 списка, проверить, являются ли их элементы списками, и если да, то проверить, являются ли элементы этих списков списками, и так далее, пока я не найду точку, где «оригинал» не соответствует «другое.

Пока что у меня есть:

def same_structure_as(original,other):

    print(type(original))
    print(type(other))

    # if either, but not both of original and other are a list, return False
    if (type(original) is list) != (type(other) is list):
        print("not match")
        return False

    print()


    if (type(original) is list):
        for i in range(len(original)):
            if (type(original[i]) is list): 
                same_structure_as(original[i],other[i])

    return True


print(same_structure_as([ 1, [ 1, 1 ] ], [ 2, 5 ] ))

Однако проблема в том, что как только я добираюсь до« return False », он возвращает False только для этой итерации. Итак итерации выше этого по-прежнему будут возвращать True, давая следующий результат при запуске:

<class 'list'>
<class 'list'>

<class 'list'>
<class 'int'>
not match
True

, тогда как я хочу, чтобы вся программа завершилась и вернула False сразу после того, как будет напечатано «не соответствует» ...

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Добавление проверки в строке рекурсивного вызова функции может помочь вам решить вашу проблему. Таким образом, когда возникает несоответствие, он вернет False на всех этапах рекурсии. def same_structure_as (исходный, другой):

    print(type(original))
    print(type(other))

    # if either, but not both of original and other are a list, return False
    if (type(original) is list) != (type(other) is list):
        print("not match")
        return False

    print()


    if (type(original) is list):
        for i in range(len(original)):
            if (type(original[i]) is list):
                if(same_structure_as(original[i],other[i])==False):
                     return False

    return True


print(same_structure_as([ 1, [ 1, 1 ] ], [ 2, 5 ] ))
0 голосов
/ 11 июля 2020

Проблема в том, что вы вызываете same_structure_as для элементов списка, но вы не используете возвращаемое значение .

Рекурсивная часть вызывается для каждого элемента список. Вам нужно совместить их вместе и вернуть объединенный результат. Идея состоит в том, что для того, чтобы два списка возвращали True, вам необходимо следующее условие:

same_as(a[0], b[0]) && same_as(a[1], b[1]) && ... && same_as(a[n], b[n])

logi c функции должен быть примерно таким:

def same_as(a ,b):

    # If the two elements have different types, then they're definitely not matching
    if type(a) != type(b):   return False
    
    # Now both elements are the same type. 
    
    # If they are not lists, it means there is no nested elements. So they have the same structure
    If type(a) is not list:  return True
    
    # At this point, both elements are lists. Check first if their sizes are the same
    if len(a) != len(b):    return False
    
    # Now the elements are lists of the same size. Compare each sub-element inside a loop
    # For the two lists to be the same structure, *ALL* their elements must be the same structure. 
    # We will use the AND operator 
    equal = False
    For i = 0:len(a):
       equal = equal && same_as(a[i], b[i])
    
    # Now the boolean 'equal' will be True ONLY if ALL the sub-elements returned True 
    return  equal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...