2012-02-17 4 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] 

И я хотел бы создать рекурсивную версию, в которой я мог бы выбрать количество петель. Поэтому, если у меня будет большее слово, он будет достаточно петли. И мне нужно будет переменный указатель позже (для этого словотворчества), поэтому я думал, что при использовании динамических переменных [Do, если его можно не знать, хотя]

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 и т. д., чтобы положить в мой for. Любая помощь/направления приветствуются! Спасибо заранее!

Редактировать: Извините, что проблема не понятна. Хорошо, я не уверен, что я должен это сделать (следует ли стереть выше?). Мне удалось создать итеративную версию того, что я хочу: ввести строку и распечатать список со всеми возможными комбинациями с этими символами.

С помощью следующей функции я получил результат, который хотел, но он ограничен 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

Если вам просто нужно сгенерировать все возможные строки, то вещий способ сделать это было бы [это] (http://stackoverflow.com/questions/ 7074051/is-there-any-best-way-to-generate-all-possible-three-letters-keywords). – malloc47

+0

Трудно понять, что вы пытаетесь сделать. Можете ли вы дать лучшее определение проблемы, которую хотите решить? –

+0

Я знаю, что вы хотите рекурсивную версию, но вместо этого я бы использовал 'itertools.combinations_wit_replacement'. Стандартный и намного проще/быстрее :) –

ответ

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 образом, он положил г-й символ списка в конце концов, с свопа, а затем ПЕРЕСТ остальное в то время как Len из остаток больше 1, когда он есть, он заменяет один элемент на правильное положение и переходит к следующему элементу.

И вы можете назвать этот класс с:

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

0

Im не 100% уверен, что вы пытаетесь достичь здесь. В текущем коде, что вы пытаетесь сделать?

Например, что случилось бы это нужно было слово "CAT" вы получите следующие результаты:

CCC, CCA, ЧМТ, CAC, CAA, CAT, СТС, СТО, СТТ

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

ТСС, ТСА, TCT, TAC, ТАА, TAT, TTC, TTA, ТТТ

, что будет результатом слова для каждого итерации (при этом только если вы печатаете после каждого задания), но в соответствии с заявленным словом ультиматум будет равен TTT.

Можете ли вы, пожалуйста, рассказать о том, каким вы хотите получить конечный результат.

Также есть намного лучшие способы в питоне для обработки строк, посмотрите на эту документацию для получения дополнительной информации http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange

С уважением Джо

Смежные вопросы