рекурсивный для с динамическим указателем - PullRequest
0 голосов
/ 17 февраля 2012

Я не нашел ответа на это. Извините, если это распространено. Я вроде новичок.

Я создаю для таких циклов (чтобы создать скрипт словаря):

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 и т. Д. Были добавлены в мой файл for. Любая помощь / направления приветствуются! Заранее спасибо!

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

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

0 голосов
/ 19 февраля 2012

Мы создали скрипт, создающий все перестановки в списке в классе, он может вам помочь:

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

Этот код построен рекурсивно, он помещает в конец i-й символ списка с помощью swap, а затем переставляет остальное, в то время как 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 голосов
/ 17 февраля 2012

Я не уверен на 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

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

...