【问题标题】:Using recursion to append to a list python使用递归追加到列表python
【发布时间】:2017-11-25 03:46:26
【问题描述】:

我用python2编写了一个递归程序来获得数字的乘法持久性;这是你必须将一个数字中的数字相乘直到你达到一个数字的次数。我还想将所有连续的乘法存储在列表中。

import operator
def persistence(n, count = []):
    n = list(str(n)) 
    if len(n) == 1:
        return len(count)
    else:
        n = list(map(int, n))
        n = reduce(operator.mul, n)
        count.append(n)
        return persistence(n)

该代码适用于进行的第一个函数调用,但不是将计数列表重置为空列表,而是保留先前获得的任何值的值。

对于第一个函数调用:

persistence(39)

输出为 3。这是预期的输出。 但是,当进行另一个函数调用时:

persistence(4)

它不是输出 0,而是输出 3;这是第一次函数调用的结果。

我认为问题在于全局列表。我尝试在函数内声明列表,但它只是在每次递归调用时将列表重置为空。有人可以帮忙吗?

【问题讨论】:

  • 搜索“Mutable default arguments Gotcha”
  • 作为旁注,除了它的长度之外,您不需要任何数不清的东西。为什么不将其类型更改为 int?
  • @bipll 对此感到抱歉。我已经编辑了帖子以表明我想存储每个连续的乘法。

标签: python recursion global-variables


【解决方案1】:

您遇到了常见的“可变默认参数”问题。

固定代码:

import operator
def persistence(n, count=None):
    if count is None:
        count = []
    n = list(str(n))
    if len(n) == 1:
        return len(count)
    else:
        n = list(map(int, n))
        n = reduce(operator.mul, n)
        count.append(n)
        return persistence(n, count) # pass in the list

调用:

print persistence(39)
print persistence(4)

生产:

3
0

【讨论】:

  • 这样就解决了问题。我还发现,在 OPs 代码中,删除“count.append(n)”并放入“return persistence(n, count + [n])”是可行的。
【解决方案2】:

从这里:http://docs.python-guide.org/en/latest/writing/gotchas/

如果尚未设置,则需要在每个调用中设置列表,如下所示:

from functools import reduce
import operator
def persistence(n, count = None):
    if count is None:
        count = []
    n = list(str(n))
    if len(n) == 1:
        return len(count)
    else:
        n = list(map(int, n))
        n = reduce(operator.mul, n)
        count.append(n)
        return persistence(n, count)

注意最后更改的递归调用。

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 2012-04-10
    • 2023-03-21
    • 2017-12-15
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多