【问题标题】:How to build a list recursively given only the length?如何仅给定长度递归地构建列表?
【发布时间】:2019-10-27 23:35:29
【问题描述】:

我正在尝试编写一个递归函数,它接受一个数字 n 和一些值,比如 'a',并递归地构建一个由 n'a's 组成的列表。

所以,func(4, 'a') 返回 ['a','a','a','a']

到目前为止,我的互联网搜索结果出人意料地徒劳无功。我发现的大多数列表递归示例都带有附加参数。

我尝试了以下代码的各种版本:

def func(n, a):
    if n == 1:
        return [a]
    else:
        return func(n-1, a).append(a)

我在最后一次返回时不断收到cannot append to NoneType 错误。所以func(n-1,a) 正在返回None

【问题讨论】:

  • 因为.append 返回None,你的 else 分支也会如此

标签: python list recursion


【解决方案1】:

list.append 只返回None,因为它的目的是就地更新目标列表。而不是追加,只需添加:

def func(n, a):
   if n == 1:
      return [a]
   else:
      return func(n-1, a) + [a]

print(func(4, 'a'))

输出:

['a', 'a', 'a', 'a']

此外,您可能需要考虑使用生成器来提供更清晰(更短)的结果:

def func(n, a):
  if n:
    yield a
    yield from func(n-1, a)

print(list(func(4, 'a')))

输出:

['a', 'a', 'a', 'a']

【讨论】:

  • 好答案。请注意,您可以将 generator function 版本缩短为简单的 yield from (a for _ in range(n))
【解决方案2】:

因为list.append 方法返回None,如果你想使用append 方法,你必须这样做:

def func(n, a):
    if n == 1:
        return [a]
    else:
        temp = func(n-1, a)
        temp.append(a)
        return temp

print(func(5, 'a'))

打印:

['a', 'a', 'a', 'a', 'a']

【讨论】:

    【解决方案3】:

    它必须是递归的吗?

    定义函数(n,a): a_list = [] 对于范围内的 i (n): a_list.append(str(a)) 返回一个列表

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 2017-06-25
      • 2011-08-07
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多