Рекурсия: выглядит как одна и та же функция, но распечатывает другой поток выполнения - PullRequest
0 голосов
/ 25 февраля 2019

Я пытался распечатать поток выполнения функции факториальной рекурсии.

def factorial(n):
    space=' '*(4*n)
    print(space,'factorial ',n)
    if n==0:
        print(space,'returning 1')
        return 1
    else:
        recurse=factorial(n-1)
        result=n*recurse
        print(space,'returning ', result)
        return n*recurse

При факториале (2) результат будет правильным:

        factorial 2
    factorial 1
factorial 0
returning 1
    returning 1
        returning 2
2

Но когда я этого не сделаюиспользуйте переменную recurse = factorial (n-1):

def factorial(n):
    space=' '*(4*n)
    print(space,'factorial ',n)
    if n==0:
        print(space,'returning 1')
        return 1
    else:
        result=n*factorial(n-1)
        print(space,'returning ', result)
        return n*factorial(n-1)

, а затем при factorial (2) он напечатал другой поток:

             factorial  2
     factorial  1
 factorial  0
 returning 1
     returning  1
 factorial  0
 returning 1
         returning  2
     factorial  1
 factorial  0
 returning 1
     returning  1
 factorial  0
 returning 1
2

Мой вопрос: почему был другой потокисполнений [с переменной и без переменной recurse = factorial (n-1)]?

1 Ответ

0 голосов
/ 25 февраля 2019

Это связано с приведенным ниже дополнительным вызовом функции в вашем коде

def factorial(n):
    space=' '*(4*n)
    print(space,'factorial ',n)
    if n==0:
        print(space,'returning 1')
        return 1
    else:
        result=n*factorial(n-1)
        print(space,'returning ', result)
        return n*factorial(n-1)   # factorial(n-1) is called second time so that this function is executed once again

Вы можете сделать, как показано ниже, для аналогичного выполнения

def factorial(n):
    space=' '*(4*n)
    print(space,'factorial ',n)
    if n==0:
        print(space,'returning 1')
        return 1
    else:
        result=n*factorial(n-1)
        print(space,'returning ', result)
        return result   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...