Рекурсивная функция может печатать, но не возвращает правильное значение

#python #python-3.x #algorithm

#python #python-3.x #алгоритм

Вопрос:

Я пытаюсь создать код для построения родительских и дочерних узлов и поиска данных. Это правила:

  1. У пользователей должны быть разные данные.
  2. Подобно древовидной структуре, пользователь 1 становится родительским узлом.
  3. Родительский узел может выполнять поиск данных из дочернего узла.
  4. Дочерний узел может искать только свои собственные данные или данные более низкого узла.

И это мой код:

 # row_data format : user id / parent id / number of data / data 1 ~ data n
row_data = ["1 0 3 1 2 3", "2 1 2 4 5", "3 1 2 6 7", "4 2 1 8", "5 0 2 9 10", "6 3 1 11", "7 6 1 12", "8 7 1 13",
        "9 8 2 14 15"]

# query "2 5": Does user 2 able to access Data 5? 
queries = ["2 5", "1 8"]
user_data = []


def search(uID, data):
    for dict in user_data:
        if data in dict["Data"]:
            if dict["USER_ID"] == uID:
                return True
            else:
                return parent_check(uID, dict["PARENT_ID"]) # [This is problem] Why isn't it return back?

def parent_check(uID, pID):
    for dict in user_data:
        if pID == dict["USER_ID"]:
            if uID == dict["USER_ID"]:
                return True # [This is problem] Why doesn't work "return"?

    return False

if __name__ == '__main__':
    for input in row_data:
        input = input.split()

        input_data = {"USER_ID": input[0], "PARENT_ID": input[1], "NUMBER_OF_DATA": input[2], "Data": input[3:]}
        user_data.append(input_data)

    for query in queries:
        uID, data = query.split()
        print(search(uID, data))
 

Я попытался решить эту проблему, используя словарный тип данных.

Мой код не показывает ошибку, но и не показывает желаемый результат. Когда я пытаюсь печатать, используя print("search complete") в return true области parent_check() , она работает отлично. Однако возврат из рекурсивного вызова не работает. Возврат отображается как none.

Когда я запускаю свой код, вывод должен быть true / true, но вместо этого я получаю true / false .

Ответ №1:

В рекурсивной функции для всех путей кода требуется return оператор. Попробуйте это:

 def parent_check(uID, pID):
    for dict in user_data:
        if pID == dict["USER_ID"]:
            if uID == dict["USER_ID"]:
                return True 
            else:
                return parent_check(uID, dict["PARENT_ID"]) 
    return False
 

Код, добавленный мной:

 else:
    return parent_check(uID, dict["PARENT_ID"]) 
 

Вывод:

 True
True