2017-10-15 1 views
-1

Je travaille sur pour écrire une fonction Python nest(a, b) qui prend une valeur a et un numéro b. Ensuite, la valeur a est placée dans un list, qui est placé dans une autre liste, et ainsi de suite, jusqu'à n niveaux.Python - Mettre une chaîne dans une liste récursivement jusqu'à n niveaux

Par exemple:

nest("foo", 3) 

devrait retourner:

[[[["foo"]]]] 
+0

Ok. Qu'avez-vous essayé? –

+0

Ce forum a pour but de vous aider à résoudre une question spécifique. Par conséquent, vous devez faire un peu de travail par vous-même. Une question comme: Je veux xy pouvez-vous programmer cela pour moi prend généralement un professionnel et donc coûte de l'argent;) –

+1

J'imagine 'nest (" foo ", 0)' devrait être '' foo "', pas '[" foo "]', ce qui signifie 'nest (" foo ", 3)' devrait être '[[" foo "]]]' '' ' – chepner

Répondre

2

Vous pouvez écrire une recursive function pour y parvenir comme:

def my_func(s, n): 
    return [s] if n == 0 else [my_func(s, n-1)] 

Sample Run:

>>> my_func('foo', 3) 
[[[['foo']]]] 

Note: Il y a une limite récursive maximale autorisée pour la pile de l'interpréteur Python. Cette limite empêche la récursion infinie de provoquer un débordement de la pile C et un écrasement de Python.

Vous pouvez vérifier cette valeur en utilisant la fonction sys.getrecursionlimit() qui selon la doc:

Retour la valeur actuelle de la limite de récursivité, la profondeur maximale de la pile de l'interpréteur Python. Cette limite empêche la récursion infinie de provoquer un débordement de la pile C et un écrasement de Python. Il peut être défini par setrecursionlimit().

+3

Même sans limite, la récursivité est une mauvaise façon de l'implémenter en Python, ce qui nécessite une quantité de mémoire inutile et beaucoup de surcharge pour les appels de fonctions supplémentaires. – chepner

3

Vous pouvez essayer,

def nest(obj, depth): 
    ret = obj 
    for _ in range(depth): 
     ret = [ret] 
    return ret 
+1

Cela ne donnera pas le résultat correct, vouliez-vous dire 'ret = [ret]'? – MSeifert

+0

Oui, je voulais dire ça. Désolé pour cette erreur stupide – bassman

+0

Au moins basé sur l'exemple de la question d'origine, vous avez une erreur hors-un ici; 'nest (obj, 3)' retournera '[[[obj]]]', pas '[[[[obj]]]]'. Pour faire correspondre l'OP, initialisez 'ret = [obj]' à la place. Cependant, je pense que c'est une interprétation plus raisonnable, où 'nest (obj, 0)' est un no-op au lieu d'encapsuler 'obj' dans une seule liste. – chepner

1

Ceci est une solution récurrente, il est à peu près naturellement de la définition du problème:

def nest(val, n): 
    if n <= 0: 
    return val 
    else: 
    return [ nest(val, n - 1) ]