【问题标题】:recursive for with dynamic pointer使用动态指针递归
【发布时间】:2012-03-09 01:33:53
【问题描述】:

我还没有找到答案。对不起,如果它很常见。我是个新手。

我正在创建这样的 for 循环(以创建字典脚本):

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 中。 欢迎任何帮助/方向! 提前致谢!

编辑: 很抱歉试图理解它的麻烦。 好的,我不确定我是否应该这样做(我应该删除上面的内容吗?)。我设法创建了我想要的迭代版本:输入一个字符串并打印一个列表,其中包含与这些字符的所有可能组合。

通过以下函数,我得到了我想要的输出,但它限制为 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”输出只是一个字符串,就像示例一样。 徽章的第一个是: 徽章 徽章 徽章 巴德斯 徽章 坏道 巴德斯 袋装 袋装 巴格达 巴格德 袋装 徽章

非常感谢您的反馈!

【问题讨论】:

  • 如果您只需要生成所有可能的字符串,那么完成此操作的 Python 方法是 this 解决方案。
  • 很难理解你想要做什么。你能更好地定义你想解决的问题吗?
  • 我知道你想要一个递归版本,但我会改用itertools.combinations_wit_replacement。标准且更容易/更快:)
  • 我不明白。您每次都在重写 word 变量。唯一重要的迭代是最后一个。也就是说,您可以将顶部的代码更改为word = n[len(n)-1] * 6。所有这些循环对我来说毫无意义。
  • 这个人的第一语言是 Erlang 或 Haskell,现在正在学习命令式风格吗?

标签: python recursion dictionary for-loop variable-assignment


【解决方案1】:

我们制作了一个脚本,在类中的列表中创建所有排列,它可以帮助您:

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时置换其余的,当它是时,它替换t第 i 个元素在他的正确位置并转到下一个元素。

你可以调用这个类:

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

【讨论】:

  • 这正是我想要的!非常感谢!
【解决方案2】:

我不能 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

这将是每次迭代的 word 的结果(仅当您在每次分配后打印)但正如所述 word 最终会等于 TTT。

您能否详细说明您想要的最终结果。

在 python 中还有更好的方法来处理字符串,请查看此文档以获取更多信息http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange

问候 乔

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2017-07-23
    • 2018-05-01
    • 2017-10-13
    相关资源
    最近更新 更多