Я пытаюсь найти пару проблем рекурсии в Python 3. * - PullRequest
0 голосов
/ 02 апреля 2020

Я довольно новичок в Python, и мне трудно понять, как оператор return работает в нескольких случаях в рекурсивной функции.

Первое:

Почему «return 10» умножает десять, когда программа не go возвращается через тест else, когда n становится 1? Другими словами, результат этого: 1200 (или 5 * 4 * 3 * 2 * 1 * 10)

def test(n):
    if n == 1:
        return 10
    else:
        return n * test(n-1)
print(test(5))

Тогда позвольте мне немного изменить это, и его результат равен 24, что означает десять добавляется к результатам ниже. Думаю, у меня просто проблемы с тем, как на самом деле работает return и как он работает при использовании в рекурсии с несколькими возвратами.

def test(n):
     if n == 1:
         return 10
     else:
         return n+test(n-1)

print(test(5))

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 02 апреля 2020

Почему «return 10» умножает десять, когда программа не go возвращает тест «else», когда n становится 1?

Это из-за n * test(n-1). Когда n становится 1, вы возвращаете 10, и рекурсия заканчивается. Так что n * test(1) похоже на n * 10. То же самое во втором случае (но с +).

Рекурсия вызывает одну и ту же функцию несколько раз. Это легче понять с помощью различных функций. Вы возвращаете число и прекращаете возвращать функцию снова, чтобы предотвратить выполнение бесконечного кода (вы получите переполнение стека).

def test1(n):
    if n == 1:                #n is 3 not 1
        return 10             #skipping
    else:                     #what to do then
        return n * test2(n-1) #return n times a value of another function, calling test2

def test2(n):
    if n == 1:                #n is 2 not 1
        return 10             #skipping
    else:                     #what to do then
        return n * test3(n-1) #return n times a value of another function, calling test3

def test3(n):
    if n == 1:                #n is 1
        return 10             #returning 10
    else:                     #never called
        return n * test4...(n-1)

print (test1 (3))

At test3 test3(n-1) становится на 10. test2(n-1) становится равным n * test3(n-1), поэтому n * 10, в данном случае 2 * 10. И test1(n-1) становится равным n * test2(n-1), поэтому n * n * 10, в данном случае 1 * 2 * 10.

Вы видите, что test1, test2 и test3 - это одни и те же функции, поэтому вы можете просто вызывать их без создания другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...