она возвращает False. дальше в ней запускаеться цикл. Если условие в цикле выполняеться - ф-ция возвращает: True, если не выполняеться: ф-ция вызывает саму себя, передает другие аргументы.
Подскажите как остановить функцию после выполнении условия True?
Сейчас она у меня возвращает True, "поднимаеться" на один уровень рекурсии выше и продолжает лупашить цикл.
А тут точно нужен цикл?
можешь брейк сделать и выйдешь из рекурсии
Можно сделать переменную-флаг за пределами функции, добавить в цикл проверку этого флага и делать return, если он стал True.
Пример: def wrapper(): flag = False def recur(n, depth): nonlocal flag if n == 20: flag = True return for i in range(1, 10): if flag == True: print(f"The flag is True, so return from the current call, depth={depth}") return print(f"{i + n:<4} depth = {depth}") recur(i + n, depth + 1) recur(0, 0) wrapper()
Да, это идея, спасибо👍 Попробую сейчас как-то избавиться от цикла, как предложил Тишка.
Без nonlocal не работает, так как переменная меняется внутри вложенной функции. Если бы просто читать значение flag, то и nonlocal бы не понадобилось.
а в чем пробелма сделать return flag?
Не понимаю - как? Кстати, я wrapper() добавил, чтобы показать, что можно без глобального флага обойтись, если есть такое желание.
У меня кейс такой: функция принимает значение ключа, словарь(ключ : список значений) и контрольный список. Подставляя значения ключа в словарь, я получаю список. В цикле беру каждое значание из этого списка(X) и смотрю есть ли такое в контрольном списке. Если есть - Тру, =стоп машина. Если нет - запустить эту же ф-цию со значением ключа Х, (тоесть проверить вдруг внутри списка с ключом Х есть что-то из контрольного списка). Можно тут как-то избавиться от цикла?
Нельзя. Цикл всё равно будет в той или иной форме, ведь нужно проверить каждое значение списка. Если взять самый первый/верхний вызов, то по нему видно, что нужно пробежаться по списку, уходя на каждом элементе этого списка рекурсивно вглубь и если ничего не найдено, проделать тоже самое со следующими элементами.
да, все так. Сделал с флагом, спасибо за подсказку👍
Обсуждают сегодня