Ответы пользователя по тегу Рекурсия
  • Что не так с рекурсией?

    Maksim_64
    @Maksim_64
    Data Analyst
    если у рекурсивного кейса отсутствует return то , базовый кейс останавливает рекурсию, но не завершает функцию. То есть после return int(answer) выхода из функции не происходит (только рекурсивный вызов остановлен). python идет дальше, пропускает else, затем у функции отсутствует return и он возвращает None.

    Что бы пофиксить надо добавить return к рекурсивному кейсу то есть return gen_nums(stop_n, number)
    Ответ написан
    Комментировать
  • Не понимаю, почему программа "тяжелая"?

    Maksim_64
    @Maksim_64
    Data Analyst
    Потому что вызовов рекурсивной функции происходит больше раз чем ты ожидаешь, и растет все это дело не линейно с увеличением n. Нужно оптимизировать рекурсивную функцию.
    from functools import lru_cache
    @lru_cache
    def F(n):
        print(n)
        if n <= 1:
            return n
        if n>1: 
            return F(n-1)+F(n-2)
    F(8)
    Вот твоя функция в точности, я добавил кеширование результатов, и print(n). Запусти с ним и без него и посмотри сколько лишних вызовов происходит. Если владеешь английским вот хорошая статья почитай как сделать своими руками, без встроенного декоратора, различные стратегии и т.д. https://realpython.com/lru-cache-python/
    Ответ написан
    1 комментарий
  • Рекурсивный вызов в цикле?

    Maksim_64
    @Maksim_64
    Data Analyst
    x - равняется 0 в твоем коде. Перенеси print(x) в самый верх и увидишь. Рекурсия это бесконечный цикл вызова функцией самой себя, до тех пор пока базовое состояние не прервет его (одно или несколько). None ты в конце видишь потому что это printтебе его возвращает, у тебя уже есть print внутри функции.
    def f(x):
        print(x)
        if x==0:
            return 
        else:
            f(x-1)         
    f(3)
    . В твоем случае он тоже выйдет и return 0 он выполняет, замени return на pass и получишь бесконечную рекурсию.

    Насчет None у тебя вот такая ситуация print(print(1))

    ОТРЕДАКТИРОВАНО После дискусии с Zzzz9, выяснилось, что я не прав насчет None. Базовый кейс в рекурсии останавливает рекурсию, но не выходит из функции. Что бы мы вернули значение базового кейса нам нужно добавить return к рекурсивному случаю. Например
    def f(x):
        if x==0:
            return 100
        else:
            f(x-1)
    print(f(3))

    Вот так выход из рекурсии настает, но рекурсивный кейс не имеет return и функция вернет None а вот в такой вариации
    def f(x):
        if x==0:
            return 100
        else:
            return f(x-1)
    print(f(3))
    Функция вернет 100. Насчет print я полную глупость написал, он возвращает None и я подумал, что это имеет место. Глупость полная. если мы добавляем return к рекурсивному кейсу то выведет то что возвращает базовый кейс. А базовый кейс только останавливает рекурсию но не выходит из функции.

    Насчет цикла если мы добавим return к рекурсивному кейсу то for цикл выполнится только один раз, потому что базовый кейс остановит рекурсию а рекурсивный кейс имеет return соответсвенно, функция напечатает изменение x + один добавочный 0, который возвращает return в базовом кейсе. Например
    def f(x):
        print(x)
        if x==0:
            return 'Конец'
        for i in range(10):
            return f(x-1)
    print(f(3))
    Цикл выполнится лишь раз и затем выход из функции.
    Ответ написан