2010-11-26 61 views
2

雖然網上有很多有關遞歸的信息,但我還沒有發現任何能夠應用於我的問題的信息。我對編程還很陌生,所以請原諒,如果我的問題是微不足道的。Python:遞歸

感謝您的幫助了:)

這是我想結束了一下:

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'] 

但到目前爲止,我只能夠拿出在那裏我需要指定一個函數/提前知道數字的位數。這是醜陋的錯誤:

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) 

這可能是很容易的,但我不能拿出來串聯字符串時,函數調用本身就是一個很好的方式。

感謝您的努力:)

+3

你真的不應該使用`list`作爲變量名。它是內建`list`類的構造函數,當你這樣做的時候,你會對它進行遮蔽。 – aaronasterling 2010-11-26 11:24:01

+0

採取的一點 - 不會再發生... – TIM 2010-11-26 12:18:31

回答

0
from itertools import combinations_with_replacement 

此功能不正是你想要的。

+0

這隻適用於python 3.1或更高版本。反正也不對。 Srinivas Reddy Thatiparth給出了正確的答案。 – aaronasterling 2010-11-26 11:16:03

0

您可以使用itertools.permutations做到這一點。

from itertools import permutations 

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

如果你想實現與遞歸函數調用類似的東西,你可以做這樣的:

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))