Py学习  »  Python

for循环内递归-Python

daniellga • 4 年前 • 1035 次点击  

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
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53603
 
1035 次点击  
文章 [ 3 ]  |  最新文章 4 年前
Babu Kanagaraj
Reply   •   1 楼
Babu Kanagaraj    4 年前

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
sammy
Reply   •   2 楼
sammy    4 年前

正如已经指出的,具体的问题是您在for循环中返回,该循环将完全结束函数。

基本上,你正在做的是混合递归和迭代实现。迭代实现使用for循环,然后不需要调用自己(因为它“知道”要运行循环多少次(即n次)并执行计算中的单个步骤)。

递归实现不使用for循环,也不知道运行单个计算步骤的次数(即使在第一次调用函数并设置n的运行时也不知道)。因此,请考虑一种方法来递归地实现它,而不使用for循环!递归是更多的思考,但只有4行代码。但如果你自己想办法的话会更有帮助。

Chris Doyle
Reply   •   3 楼
Chris Doyle    4 年前

因此,在递归解决方案中,您不使用for循环,而是使用函数式编程模型,即使用堆栈作为循环

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


recur_factorial(5)

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]