Python 我的程序的递归?

Python 我的程序的递归?,python,recursion,Python,Recursion,这段代码的作用是打印出一种组合中可以播放的所有n个组合。其中S=Spades,H=Hearts,D=Diamonds,和C=Clubs。因此,在这种情况下,手会产生: [['3H'], ['3H', '3C'], ['3H', '3D'], ['3H', '3C', '3D'], ['3C'], ['3C', '3D'], ['3D'], ['4S'], ['6D'], ['7D'], ['9S']] 对于所有可玩的n个组合 我想知道是否有一种方法可以让我在递归循环中完成这段代码?因为如果一个

这段代码的作用是打印出一种组合中可以播放的所有n个组合。其中
S=Spades
H=Hearts
D=Diamonds
,和
C=Clubs
。因此,在这种情况下,手会产生:

[['3H'], ['3H', '3C'], ['3H', '3D'], ['3H', '3C', '3D'], ['3C'], ['3C', '3D'], ['3D'], ['4S'], ['6D'], ['7D'], ['9S']]
对于所有可玩的n个组合

我想知道是否有一种方法可以让我在递归循环中完成这段代码?因为如果一个卡片组中有4套以上的套装,那么继续重新键入迭代会变得很乏味

hand = ['3H', '3C', '3D', '4S', '6D', '7D', '9S']

def generate_plays(sorted_hand_value):
    playable_card = []
    for i in range(len(hand)):  
        playable_card.append([sorted_hand_value[i]]) # appends 1 of a kind to the     playable_cards list

    if i+3 <= (len(hand)-1): #need this restriction of that the interation won't index something that is out of the range of the list

        if sorted_hand_value[i][0] == sorted_hand_value[i+1][0]: #checks if first and second card have the same value
            playable_card.append(list((sorted_hand_value[i],sorted_hand_value[i+1]))) #appends 2 of a kind to the playable_card list

            if sorted_hand_value[i][0] == sorted_hand_value[i+2][0]:
                playable_card.append(list((sorted_hand_value[i],sorted_hand_value[i+2]))) #checks if first and third card have the same value
                playable_card.append(list((sorted_hand_value[i],sorted_hand_value[i+1],sorted_hand_value[i+2]))) #appends 3 of a kind to the playable_card list 

                if sorted_hand_value[i][0] == sorted_hand_value[i+3][0]:
                    playable_card.append(list((sorted_hand_value[i],sorted_hand_value[i+3])))#checks if first and fourth card have the same value
                    playable_card.append(list((sorted_hand_value[i],sorted_hand_value[i+1],sorted_hand_value[i+2],sorted_hand_value[i+3]))) #appends 4 of a kind to the playable_card list

    elif i+2 <= (len(hand)-1):

        if sorted_hand_value[i][0] == sorted_hand_value[i+1][0]:
            playable_card.append(list((sorted_hand_value[i],sorted_hand_value[i+1])))

            if sorted_hand_value[i][0] == sorted_hand_value[i+2][0]:
                playable_card.append(list((sorted_hand[i],sorted_hand[i+2])))
                playable_card.append(list((sorted_hand_value[i],sorted_hand_value[i+1],sorted_hand_value[i+2])))

    elif i+1 <= (len(hand)-1):

        if sorted_hand_value[i][0] == sorted_hand_value[i+1][0]:
            playable_card.append(list((sorted_hand_value[i],sorted_hand_value[i+1])))
return playable_card

print generate_plays(hand) # 
hand=['3H','3C','3D','4S','6D','7D','9S']
def生成播放(已排序的手牌值):
可玩的_卡=[]
对于范围内的i(len(hand)):
可玩的卡片。追加([sorted_hand_value[i]])#将一种类型的卡片追加到可玩的卡片列表中
如果我+3
然后

给予


您可以使用groupby来选择具有相同值的卡片组(首先对它们进行排序,以确保它们都在一起),然后使用powerset配方来生成所有种类的n(不包括空集)

输出为:

[['3C'], ['3D'], ['3H'], ['3C', '3D'], ['3C', '3H'], ['3D', '3H'],
 ['3C', '3D', '3H'], ['4S'], ['6D'], ['7D'], ['9S']]
你说的“n”是什么意思?这通常与面值(即三个十)有关,而不是与西装有关。你说的“可以玩”是什么意思?游戏规则是什么?
print(n_of_a_kind(hand))
[('4S',), ('7D',), ('6D',), ('9S',), ('3H',), ('3C',), ('3D',), ('3H', '3C'), ('3H', '3D'), ('3C', '3D'), ('3H', '3C', '3D')]
from itertools import groupby, combinations

def kinds(cards):
    for _, cs in groupby(sorted(cards), lambda x: x[0]):
        s = list(cs)
        for r in xrange(1, len(s)+1):
            for p in combinations(s, r):
                yield list(p)

print list(kinds(['3H', '3C', '3D', '4S', '6D', '7D', '9S']))
[['3C'], ['3D'], ['3H'], ['3C', '3D'], ['3C', '3H'], ['3D', '3H'],
 ['3C', '3D', '3H'], ['4S'], ['6D'], ['7D'], ['9S']]