для цикла внутри рекурсии - Python - PullRequest
0 голосов
/ 03 ноября 2019

Может кто-нибудь сказать, почему функция не завершает цикл for в приведенном ниже коде? Чего мне не хватает и как я могу заставить его работать?

def recur_factorial(n, j=0):
    j += 1
    print('j=',j)
    print('n=', n)
    if n == 1:
        return(1)
    else:
        for i in range(2, n):
            print('i=', i)
            return i * recur_factorial(n = i - 1, j = j)
    print('reached end of function')

С этим вводом:

recur_factorial(5)

Я получаю следующий вывод:

j= 1
n= 5
i= 2
j= 2
n= 1
2

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

Таким образом, в рекурсивном решении вы не используете цикл for, а вместо этого используете функциональную программную модель использования стека в качестве цикла

def recur_factorial(n):
    total = 1
    if n > 1:
        total = n * recur_factorial(n - 1)
    print(total)
    return total


recur_factorial(5)

OUTPUT

1
2
6
24
120

Надеюсь, это даст вам лучшее представление, и если ваши требования изменятся, вы можете просто адаптировать эту модель для достижения того, что вам нужно.

ОБНОВЛЕНИЕ

Только что в своем комментарии вы сказали, что функция должна возвращать list факториалов от 2 до n. поэтому ниже обновлен код для возврата списка.

def recur_factorial(n, factorials=[]):
    if n == 1:
        factorials.append(1)
    else:
        total = n * recur_factorial(n - 1)[-1]
        factorials.append(total)
    return factorials

factorials = recur_factorial(10)
print(factorials)

ВЫХОД

[2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
1 голос
/ 03 ноября 2019

Есть много способов сделать факториал числа, но, просматривая ваш код, я нашел ошибку и исправил ее. Здесь идет обновленный рабочий код,

def recur_factorial(n, j=0):
j += 1
print('j=',j)
print('n=', n)    
if n == 1:
    return(1)
else:
    stop = n
    for i in range(2, stop + 1):
        print('i=', i)
        return n * recur_factorial(n = n - 1, j = j)
print('reached end of function') ##This statement will not execute since the function is returning before this statement
1 голос
/ 03 ноября 2019

Как уже указывалось, конкретная проблема заключается в том, что вы возвращаетесь в цикл for, который полностью завершает функцию.

Однако, предполагая, что вы хотите рекурсивно реализовать вычисление факториала, я бы предложил полностью пересмотреть ваш код. настоящая проблема заключается не в цикле for и операторе return, а в том, как вы к этому подходите.

По сути, вы делаете смешивание рекурсивной и итеративной реализации. Итеративная реализация использует цикл for, а затем ей не нужно вызывать себя (потому что она «знает», сколько раз запустить цикл (т.е. n раз) и выполнить отдельные шаги в вычислениях).

рекурсивная реализация не использует цикл for и не «знает», сколько раз запускать отдельные шаги вычисления (даже во время выполнения, когда функция вызывается в первый раз и устанавливается n). Поэтому придумайте способ реализовать его рекурсивно без цикла for! Рекурсивно больше думать, но только 4 строки кода. Но будет более полезно, если вы попытаетесь найти решение самостоятельно.

...