Object 具有有限空间的对象组合的递归

Object 具有有限空间的对象组合的递归,object,recursion,combinations,Object,Recursion,Combinations,在Python中,我尝试开发一个递归for循环,它可以生成一个列表,其中包含Y组合中的X对象。例如,如果X=26(比如字母表)和Y=5(单词长度),我需要生成所有可能的5个字母单词的列表。程序没有使用字母,但是,它使用的对象已经在一个X长的列表中。有什么建议吗 我想我需要一个Y的重复计数器,X的循环需要一个迭代递归计数器,但我一直在关注细节。我试着在纸上画出来,但是递归的特性让我头疼 编辑:根据下面的答案,我开发了以下不需要递归的脚本: list1 = ["v", "

在Python中,我尝试开发一个递归for循环,它可以生成一个列表,其中包含Y组合中的X对象。例如,如果X=26(比如字母表)和Y=5(单词长度),我需要生成所有可能的5个字母单词的列表。程序没有使用字母,但是,它使用的对象已经在一个X长的列表中。有什么建议吗

我想我需要一个Y的重复计数器,X的循环需要一个迭代递归计数器,但我一直在关注细节。我试着在纸上画出来,但是递归的特性让我头疼

编辑:根据下面的答案,我开发了以下不需要递归的脚本:

list1 = ["v", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"]

def combo(object_list, spots):
    pool = len(object_list)
    total = pool**spots
    permlist = list()
    wordlist = list()
    z = []
    for i in range(total):  
        print("top", wordlist) 
        wordlist = []
        z = base(i,pool,spots)
        for q in z:  
            j=-1
            for a in object_list:
                j+=1
                if int(q) == int(j):
                    wordlist.append(a)
        permlist.append(wordlist)
    return permlist


def base(number, base, digits):
    remainder = []
    result = [0,0]
    while number >0:
        dividend = number // int(base)
        remainder.append(str(number % int(base)))
        number = dividend
        result = list(reversed(remainder))
    while len(result) < digits:
        result.insert(0,0)
    return result

print (combo(list1,4))
list1=[“v”、“b”、“c”、“d”、“e”、“f”、“g”、“h”、“i”、“j”、“k”、“l”、“m”、“n”]
def组合(对象列表、点):
pool=len(对象列表)
总数=游泳池**点
permlist=list()
wordlist=list()
z=[]
对于范围内的i(总计):
打印(“顶部”,单词列表)
单词表=[]
z=基础(i、池、点)
对于z中的q:
j=-1
对于in-object_列表:
j+=1
如果int(q)==int(j):
追加(a)
permlist.append(单词列表)
返回永久列表
def基数(数字、基数、位数):
余数=[]
结果=[0,0]
当数字>0时:
股息=数字//整数(基数)
余数.追加(str(数字%int(基)))
数字=股息
结果=列表(反向(剩余))
而len(结果)<位数:
结果.插入(0,0)
返回结果
打印(组合(列表1,4))

一种生成所有可能性的简单方法只需要一个循环,而不需要递归

你可以把这看作是一个简单的计数问题。用你的类比,我们可以把一个5个字母的单词想象成以26为底的5位数字。本例中可能的结果数为265。265 = 11,881,376. 因此,我们从0到11881376进行计数,然后将每个值转换为以26为基数的数字,并将每个以26为基数的数字作为索引(在本例中)转换为字母表

在您的例子中,位数和基数可能都不同(听起来您使用的“基数”也可能不是常数),但这两者都不会带来特别困难的问题


根据您的评论,您只需要每个数字都是唯一的“数字”。考虑到生成所有组合(简单计数)是多么容易,生成计算范围内的每个数字,然后过滤掉任何重复的“数字”可能是最容易的方法。

是否允许在结果中重复?用你的5个字母的单词类比,“AAAAA”是一个有效的单词吗?理想情况下不是,但我可以在一个单独的函数中过滤掉它,如果它使代码更简单的话。这需要一些工作来保持参数作为变量,但我成功了!谢谢你的帮助。我在原始问题中发布了我的代码。