3
votes

Liste des listes utilisant la récursivité

Je suis bloqué depuis un certain temps sur certains apprentissages en ligne que j'essaye.

J'ai besoin de créer une liste de listes vides en utilisant la récursivité.

La chose étrange est que je pensais comprendre un algorithme factoriel (pour lequel il y a beaucoup d'aide) mais pas avec ceci et comme un résultat, il ne renvoie toujours que le seul [].

Par exemple, si n = 4 alors je m'attendrais à [[], [], [], [] ]

def listOfLists(n):

    lists = []

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


4 commentaires

C'est là que je me suis mis dans une torsion. Sur cette tentative particulière, j'ai essayé de commencer par le for, mais sur mes autres tentatives, il a juste commencé avec des instructions if.


Merci BoarGules mais je dois utiliser la récursivité dans cette méthode particulière.


J'ai failli ne pas publier car j'ai entendu beaucoup de choses négatives sur les réponses sur SO. Alors avant de poster, j'ai lu ceci et je me suis mis à l'aise. stackoverflow.blog/2018/04 / 26 /…


SO peut certainement être accueillant, tout ce que nous demandons, c'est que les utilisateurs mettent un certain effort pour résoudre le problème par eux-mêmes avant de venir ici, en fournissant en outre toutes les informations nécessaires dans la question elle-même, y compris le code, le problème rencontré, ce que vous J'ai essayé, ce que vous essayez de faire, quels résultats vous attendez, quels résultats vous obtenez à la place, etc. Si vous êtes intéressé, je vous suggère de lire l'article de blog de Jon Skeet sur écriture de la question parfaite (C'est assez une lecture mais il contient quelques points intéressants)


7 Réponses :


-1
votes

Vous pouvez faire ceci:

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

Le résultat est:

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)

Le meilleur


2 commentaires

Merci Macouille mais je dois utiliser la récursivité dans cette méthode particulière.


J'ai mis à jour ma réponse, srry



5
votes

Vous n'utilisez pas la réponse de votre appel récursif, essayez de comprendre ce code (j'ai essayé de garder le formulaire similaire au vôtre):

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

Ceci écrit "sec- run "peut vous aider à le comprendre (pour listOfLists(3)):

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


1 commentaires

Je vous remercie. Cela fonctionne un régal, je vais maintenant passer en revue toutes mes versions précédentes pour déterminer où je me suis trompé.



0
votes

Une autre variante à considérer. Cela utilise un argument supplémentaire avec une valeur par défaut.

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

print(listOfLists(4))


0 commentaires

1
votes

La fonction récursive a déjà été donnée dans d'autres réponses, je veux expliquer pourquoi votre code ne fonctionne pas comme prévu. Le coupable est cette ligne:

x = [1,2,3]
y = x.append(4)
print(y) #None
print(x) #[1, 2, 3, 4]

à la place, elle devrait être:

lists = lists+[[]]

ou alternativement:

lists.append([])


0 commentaires

0
votes

Si vous devez utiliser la récursivité pour résoudre un problème mieux adapté à la répétition, vous pouvez le faire. Je suis resté aussi proche de votre original que je le pouvais raisonnablement.

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

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


0 commentaires

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

    listOfLists(n-1,lists)
    return lists

print (listOfLists(4))
result: [[], [], [], []]

0 commentaires

0
votes

Il existe d'excellentes réponses récursives publiées, cependant, il est également possible d'utiliser des générateurs avec récursivité:

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

Sortie:

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

print(list(listOfLists(4)))

p >


1 commentaires

Merci, mais je ne suis pas encore arrivé à quelque chose comme ça mais sans aucun doute ce sera utile.