Найти - Пользователи
Полная версия: Помогите понйть поведение функции .
Начало » Python для новичков » Помогите понйть поведение функции .
1
Malinaizer
Не могу понять откуда берется число возращаемое функцией .
 def Fibonacci(n):
    if n == 0:
        return 0
    elif n == 1 or n == 2:
        return 1
    else:
        return Fibonacci(n - 1) + Fibonacci(n - 2)
Fibonacci(35) 
py.user.next
Malinaizer
Не могу понять откуда берется число возращаемое функцией
Число берётся из return, после того как там всё сработало и вышло через свои return'ы.

Здесь описывал принципы рекурсивной функции.
Malinaizer
py.user.next
Число берётся из return, после того как там всё сработало и вышло через свои return'ы.
Какое то не очевидное поведение, почему суммируется количество рекурсий и куда оно записывается ? !
py.user.next
Malinaizer
Какое то не очевидное поведение
Так ты не понимаешь просто, что такое рекурсия, что такое вызов функции и как он происходит.

Malinaizer
почему суммируется количество рекурсий
Рекурсия здесь одна. Здесь нет множества каких-то рекурсий.

Malinaizer
и куда оно записывается
Оно никуда не записывается.

Ты просто начал изучение рекурсии с Фибоначчи, а надо начинать с чего-то попроще. Начни с факториала.
  
>>> def fact(n):
...     if n > 1:
...         return n * fact(n - 1)
...     else:
...         return 1
... 
>>> fact(5)
120
>>> fact(0)
1
>>> fact(1)
1
>>> fact(2)
2
>>> fact(3)
6
>>> fact(4)
24
>>> fact(5)
120
>>>
Malinaizer

py.user.next
def fact(n):
… if n > 1:
… return n * fact(n - 1)
… else:
… return 1

>>> fact(5)
120
Вроде до перло . Получается что функция вызывается рекурсивно до те пор пока не не сработает if n > 1:? ID рекурсивно вызваных функций индентичен друг другу или занчанения изменились значит и ID разный ? Что происходит с предыдущей рекурсией , она остается в памяти до конца выполнения условия или удаляется ???
py.user.next
Вот смотри, видишь эти функции?
  
def fact1(n1):
    if n1 > 1:
        return n1 * fact2(n1 - 1)
    else:
        return 1
 
def fact2(n2):
    if n2 > 1:
        return n2 * fact3(n2 - 1)
    else:
        return 1
 
def fact3(n3):
    if n3 > 1:
        return n3 * fact4(n3 - 1)
    else:
        return 1
 
def fact4(n4):
    if n4 > 1:
        return n4 * fact5(n4 - 1)
    else:
        return 1
 
...
Чем они отличаются? Тут хорошо видно, что это разные функции. Устроены они одинаково, но при этом они все разные.

Вот при рекурсии происходит то же самое. Каждый новый вызов функции самой себя создаёт как бы новую такую же функцию, в которой есть всё то же самое, но при этом оно всё хранит в себе совершенно другие собственные данные. Структура одинаковая, а данные каждый раз внутри функции оказываются новые абсолютно. И вот эти функции ещё и общаются между собой. Одна функция вызывает какую-то и передаёт в неё информацию. А та функция отрабатывает все свои действия и в конце возвращает какую-то новую информацию обратно.

Вот хоть сто вызовов будет вот таких, это всё будет в виде функций с номерами 1, 2, 3, … , 98, 99, 100. И в каждой функции будет что-то своё. Пока они все будут работать, они все одновременно будут находиться в памяти, каждая на своём индивидуальном месте.


tags: recursion
Malinaizer
Спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB