使用递归实现的列表嵌套列表

3

我在尝试在线学习时遇到了一些困难。

我需要使用递归创建一个空列表的列表。

奇怪的是,我以为我理解了阶乘算法(有很多帮助),但对于这个问题却不行,结果总是只返回单个 [ ]。

例如,如果 n=4,那么我期望得到 [[ ], [ ], [ ] ,[ ]]

def listOfLists(n):

    lists = []

        if i <= 1:
            return lists
        else:
            lists += lists.append([])
            listOfLists(n-1)

这就是我陷入困境的地方。在这次尝试中,我尝试从for开始,但在其他尝试中,它只是从if语句开始。 - Bob24
1
谢谢BoarGules,但我必须在这个特定的方法中使用递归。 - Bob24
我差点没发帖,因为我听说过很多关于SO回复的负面消息。所以在我发帖之前,我阅读了这篇文章,让我感到放心。https://stackoverflow.blog/2018/04/26/stack-overflow-isnt-very-welcoming-its-time-for-that-to-change/ - Bob24
SO肯定是欢迎的,我们只是要求用户在来这里之前自己努力解决问题,并在问题本身中提供所有所需的信息,包括代码、遇到的问题、你尝试过什么、你想做什么、你期望的结果、你得到的结果等等。如果您感兴趣,我建议您阅读Jon Skeet关于编写完美问题的博客文章(它很长,但其中有一些有趣的观点)。 - Nick stands with Ukraine
7个回答

5
您没有使用递归调用的响应,试着理解这段代码(我尝试保持与您的形式相似):
def listOfLists(n):
    lists = [[]]
    if n <= 1:
        return lists
    else:
        return lists + listOfLists(n-1)

这份文字版的“干运行”可能有助于您理解(对于listOfLists(3)):

Call - listOfLists(3)
 Call - listOfLists(2)
  Call - listOfLists(1)
  Return [[]] # From listOfLists(1)
 Return [[]] + [[]] # From listOfLists(2)
Return [[]] + [[],[]] # From listOfLists(3)

1
谢谢。这个很有效,我现在要检查所有以前的版本,确定我哪里出了问题。 - Bob24

1

其他答案已经给出了递归函数,我想解释一下为什么你的代码不像预期的那样工作。罪魁祸首就是这行代码:

lists += lists.append([])

相反,应该是:

而不是:

lists.append([])

或者,另一种选择是:
lists = lists+[[]]

请注意,.append方法将元素添加到list的末尾并返回None,请参考以下示例:
x = [1,2,3]
y = x.append(4)
print(y) #None
print(x) #[1, 2, 3, 4]

正如您所看到的,append 方法改变了 x 列表,而 yNone,而不是 [1,2,3,4]。尽管如此,即使在进行修复后,您的函数也不会成为一个 递归 函数。


0

另一种供您考虑的变体。这使用了一个带有默认值的附加参数。

def listOfLists(n, lists = []):
    if n > 0:
        lists.append([])
        return listOfLists(n-1, lists)
    else:
        return lists

print(listOfLists(4))

0

如果你必须使用递归来解决一个更适合重复的问题,那么你可以这样做。我尽可能地保持了与您原始代码的相似性。

def listOfLists(n):
    if n <= 0:
        return []
    else:
        return [ [] ] + listOfLists(n-1)

>>> listOfLists(4)
[[], [], [], []]

0
def listOfLists(n,lists=[]):
    lists.append([])
    if n == 1:   
        return

    listOfLists(n-1,lists)
    return lists

print (listOfLists(4))

结果:[[], [], [], []]


0

有很棒的递归答案发布了,然而,也可以使用递归生成器:

def listOfLists(n):
   if n:
     yield []
     yield from listOfLists(n-1)

print(list(listOfLists(4)))

输出:

[[], [], [], []]

谢谢,但我还没有接触过这样的东西,但毫无疑问它会很有用。 - Bob24

-1
你可以这样做:
def listoflist_func(n, currentList=[]):
    if n < 0:
        return "Error: n must be > 0"
    elif n==0:
        return currentList
    else:
        currentList.append([])
        return listoflist_func(n-1, currentList)


print listoflist_func(4)

结果是:

[[], [], [], []]

最好的


2
谢谢你的建议,Macouille,但是我必须在这个特定的方法中使用递归。 - Bob24
1
更新了我的回答,抱歉。 - Maxouille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接