2012-02-17 74 views
0

我還沒有找到答案。很抱歉,如果它很常見。我有點新手。用於動態指針的遞歸

我創造了這樣的循環(創建一個字典腳本):

for i1 in range(len(n)): 
    for i2 in range(len(n)): 
     for i3 in range(len(n)): 
      for i4 in range(len(n)): 
       for i5 in range(len(n)): 
        for i6 in range(len(n)): 
         word = n[i1] + n[i2] + n[i3] + n[i4] + n[i5] + n[i6] 

而且我想創建一個遞歸版本中,我可以選擇的迴路數。所以如果我有一個更大的單詞,它會足夠循環。 後來我需要指針變量(這個詞創作),所以我想在使用動態變量[不知道它可能的,雖然]

n = len(string) 
def loop(n): #'n' is a string and the length would be the number of recursions 
    if n > 0: 
     var1 [defining my dynam. var] 
     for var1 in range(len(string)): 
      loop(n-1) 
    else:     
     return word() #I guess I know how to code this one 

所以..我想有一個像變量var1,var2,var3等放在我的。 歡迎任何幫助/指示! 在此先感謝!

編輯: 對不起,試圖瞭解它的麻煩。 好吧,我不知道我是否應該這樣做(我應該抹去上述?)。我設法創建了我想要的迭代版本:輸入一個字符串並打印一個列表,列出所有可能與這些字符組合的列表。

使用以下函數我得到了我想要的輸出,但它被限制爲6個字符。我想用遞歸版本可以得到任何輸入,並根據需要創建儘可能多的循環。 [現在好了解釋?]

我的真實腳本如下(我不知道有這樣的過濾器/檢查的更好的方法):

def rec(): 
    word = "" 
    txtfile = open(arq,'w') #arq is the string input + .txt 
    s=0 #Counts the number of words writen 
    t=0 #tests if the word exists 
    for i1 in range(len(n)): 
     for i2 in range(len(n)): 
      for i3 in range(len(n)): 
       for i4 in range(len(n)): 
        for i5 in range(len(n)): 
         for i6 in range(len(n)): 
          #This is a filter for not repeating the same character in a word 
          if not (i1 == i2 or i1 == i3 or i1 == i4 or i1 == i5 or i1 == i6 \ 
           or i2 == i3 or i2 ==i4 or i2 == i5 or i2 ==i6 \ 
           or i3 == i4 or i3 == i5 or i3 == i6 \ 
           or i4 == i5 or i4 == i6 \ 
           or i5 == i6): 
           word = n[i1] + n[i2] + n[i3] + n[i4] + n[i5] + n[i6] 
           txtfile.close() 
           data_file = open(arq) 
           #This one search for the word in the file, for not having duplicates 
           for line in data_file: 
            if line == word + "\n" : 
             t = 1 
            else: 
             pass 
           data_file.close() 
           if not t == 1: 
            s+=1 
            txtfile = open(arq,'a') 
            txtfile.writelines(word + "\n") 
           t=0 

    print ("Number of words writen:",s) 

我對「EEEEEE」輸出僅僅是一個字符串,就如同例子。 而首當其衝的徽章是: 徽章 badgse badegs badesg badsge badseg bagdes bagdse bageds bagesd bagsde bagsed baedgs

非常感謝您的反饋!

+2

如果你只需要簡單地生成所有可能的字符串時,Python的方式來實現,這將是[這](http://stackoverflow.com/questions/ 7074051 /是否有任何最佳方式生成所有可能的三字母關鍵字)解決方案。 – malloc47 2012-02-17 16:39:19

+0

很難理解你想要做什麼。你能給出一個你想解決的問題的更好的定義嗎? – 2012-02-17 16:40:35

+0

我知道你想要一個遞歸版本,但我會使用'itertools.combinations_wit_replacement'來代替。標準和更容易/更快:) – 2012-02-17 16:42:58

回答

0

我們已經做了一個腳本列表中創建所有排列類,它可以幫助你:

class Permutations : 
    def __init__(self , blist) : 
     self.alist=blist 
     self.permut_list = [] 
     self.permutation(len(self.alist)) 

    def swap(self , blist , i , j) : 
     blist[i], blist[j] = blist[j] ,blist[i] 

    def permutation(self, taille): 
     if taille == 1 : 
      self.tmp = self.alist[:] 
      self.permut_list.append(self.tmp) 
     else : 
      for i in range(taille) : 
       self.swap(self. alist , i , taille −1) 
       self.permutation(taille −1) 
       self.swap(self.alist , i , taille −1) 

    def __repr__(self): 
     repre = """""" 
     for i in self.permut_list: 
      repre += ''.join(i)+"\n" 
     return repre 

這個代碼在recursiv方式構建,它把列表的第i個字符,在年底,交換,然後PERMUT休息時的的LEN休息時間大於1時,它在正確的位置替換第i個元素,並轉到下一個元素。

你可以調用這個類:

text = "abc" 
text_list = [] 
for i in range(len(text)): 
    text_list.append(text[i]) 
permu_text = Permutations(text_list) 
print permu_text 
+0

這正是我想要的!非常感謝! – ramtoo 2012-02-20 17:25:31

0

我不是100%確定你在這裏嘗試做什麼。在你當前的代碼中,你想要做什麼?

例如會發生什麼是你有單詞 「CAT」,你會得到以下結果:

CCC,CCA,CCT,CAC,CAA,CAT,CTC,CTA,CTT

ACC ,ACA,ACT,AAC,AAA,AAT,ATC,ATA,ATT

TCC,TCA,TCT,TAC,TAA,TAT,TTC,TTA,TTT

這將是單詞的每一個結果迭代(只有當你在每個任務完成後纔打印時),但是所說的單詞最終會等於TTT。

請問您可以擴展您想要的最終結果。

還有一些用於處理字符串的python更好的方法來看看這個文檔的詳細信息http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange

問候 喬