【问题标题】:Recursively generating a list of n factorial in Python在 Python 中递归生成 n 阶乘列表
【发布时间】:2017-03-26 09:35:59
【问题描述】:

我无法在 Python 中实现这一点。我想用(唯一的)输入 n 编写一个函数,它递归地生成一个阶乘值 1 的列表! ...不!

到目前为止,我已经考虑将递归派生的 n 阶乘值存储在一个变量中,然后将它们添加(推送?)到一个列表中。我的问题是如何“保存”列表?我不确定如何检查列表是否存在......

def recFactorial(n):
    if n == 1:
        return 1
        print(l)
    else:
        l = []
        f = n * recFactorial(n-1)
        if l:
            l = l.push(f)
        else:
            l = []

【问题讨论】:

  • 为什么要用递归来做这件事?是作业吗?
  • 这不是作业,它是(未评分的)研讨会的一部分。我了解递归,但我不知道如何实现递归列表。

标签: python list recursion


【解决方案1】:

由于您在递归中遇到麻烦的局部变量,我建议您添加一个包装函数。下面那个呢?

def fact_wrapper(n):
    lst = [1]
    def fact(n):
        if n == 0 or n==1:
            return 1
        else:
            a = n * fact(n-1)
            lst.append(a)
            return a

    fact(n)
    return lst


print(fact_wrapper(5)) 

输出:

[1, 2, 6, 24, 120]

如果递归不是那么重要,你可以写一个简单的生成器:

def factorial(n):
    result = 1
    for i in range(1,n+1):
       result *= i
       yield result

那么,

print list(factorial(5))

输出:

[1, 2, 6, 24, 120]

或者,您也可以使用next() 懒惰地评估值。如果你不熟悉 python 生成器,你可能会看到this

【讨论】:

  • 这家伙好像对生成器不熟悉。您可以向他展示如何使用的示例。
【解决方案2】:

递归函数调用看不到对同一函数的其他调用的局部变量。如果您希望多个调用能够使用同一个列表,则该列表需要是函数的参数或返回值(或者我认为是全局变量,但这将是非常糟糕的设计)。

在这种情况下,我认为将列表作为函数的返回值传递是最简单的。它将在基本情况下创建,您将在其中返回简单列表[1]。每个外部调用都会将一个值附加到列表中(并使用之前在其上的最后一个值进行计算)。

def recFactorialList(n):
    if n == 1:
        return [1]   # base case, still returns a list

    lst = recFactorialList(n-1)
    n_fac = lst[-1] * n   # use the last value to calculate a new value
    lst.append(n_fac)   # add n factorial to the end of the list
    return lst   # return the updated list

【讨论】:

    【解决方案3】:

    您的代码中缺少的关键内容是:

    1. 由于您希望函数返回一个列表,因此基本情况 (n==1) 需要返回一个列表,正如 Blckknght 在他的回答中所解释的那样。
    2. 非基本情况 (n>1) 也需要返回一些东西!在编写递归代码时忽略从每个执行路径返回某些内容,这是一个非常常见的错误。

    这个版本是一个递归生成器。它不返回一个列表,它是一个每次生成一个阶乘值的可迭代对象,但如果您愿意,可以很容易地在列表中捕获这些值。

    def gen_factorial(n):
        if n == 1:
            yield 1
        else:
            for u in gen_factorial(n - 1):
                yield u
            yield u * n
    
    for u in gen_factorial(5):
        print(u)
    
    print(list(gen_factorial(8)))
    

    输出

    1
    2
    6
    24
    120
    [1, 2, 6, 24, 120, 720, 5040, 40320]
    

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 2015-04-19
      • 2019-08-06
      相关资源
      最近更新 更多