2010-11-26 24 views
2

Bien qu'il y ait beaucoup d'informations sur la récursivité sur le web, je n'ai rien trouvé que je pouvais appliquer à mon problème. Je suis encore très novice en programmation alors excusez-moi si ma question est plutôt triviale.Python: récursion

Merci de nous aider à :)

C'est ce que je veux terminer par:

listVariations(listOfItems, numberOfDigits) 

>>> listVariations(['a', 'b', 'c'], 1) 
>>> ['a', 'b', 'c'] 

>>> listVariations(['a', 'b', 'c'], 2) 
>>> ['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc'] 

>>> listVariations(['a', 'b', 'c'], 3) 
>>> ['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc'] 

, mais jusqu'à présent, je ne ai pu arriver à une fonction où je dois préciser/connaître le nombre de chiffres à l'avance. Ce qui est laid et le mal:

list = ['a', 'b', 'c'] 

def listVariations1(list): 
    variations = [] 
    for i in list: 
    variations.append(i) 
    return variations 

def listVariations2(list): 
    variations = [] 
    for i in list: 
    for j in list: 
     variations.append(i+j) 
    return variations 

def listVariations3(list): 
    variations = [] 
    for i in list: 
    for j in list: 
     for k in list: 
     variations.append(i+j+k) 
    return variations 

oneDigitList = listVariations1(list) 
twoDigitList = listVariations2(list) 
threeDigitList = listVariations3(list) 

Ceci est probablement très facile, mais je ne pouvais pas trouver une bonne façon de concaténer les chaînes lorsque la fonction elle-même appelle.

Merci pour votre effort :)

+3

Vous devriez vraiment pas utiliser 'list' comme nom de variable. C'est le constructeur de la classe 'list' intégrée et quand vous faites cela, vous l'ombrez. – aaronasterling

+0

point pris - ne se reproduira plus ... – TIM

Répondre

5

Vous pouvez utiliser la fonction product() dans itertools

+4

'list (''. Join (item) pour item dans itertools.product (list_, repeat = 3))' – aaronasterling

+0

c'est exactement ce que je cherchais à réaliser. Merci les gars :) – TIM

0
from itertools import combinations_with_replacement 

Cette fonction fait exactement ce que vous voulez.

+0

Cela ne fonctionne que dans Python 3.1 ou supérieur. Et ne va pas de toute façon. Srinivas Reddy Thatiparth a donné la bonne réponse. – aaronasterling

0

Vous pouvez utiliser itertools.permutations pour ce faire.

from itertools import permutations 

def listVariations(listOfItems, numberOfDigits): 
    return [''.join(x) for x in permutations(listOfItems, numberOfDigits)] 

Si vous voulez mettre en œuvre quelque chose de similaire avec appel de fonction récursive, vous pouvez le faire comme ceci:

def permute(seq, n): 
    for i in xrange(len(seq)): 
     head, tail = seq[i:i+1], seq[0:i]+seq[i+1:] 
     if n == 1: 
      yield head 
     else: 
      if tail: 
       for sub_seq in permute(tail, n-1): 
        yield head + sub_seq 
      else: 
       yield head 

a_list = ['a', 'b', 'c'] 
list(permute(''.join(a_list), 2)) 
a_str = 'abc' 
list(permute(a_str, 2))