Python 我的程序的递归?
这段代码的作用是打印出一种组合中可以播放的所有n个组合。其中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个组合 我想知道是否有一种方法可以让我在递归循环中完成这段代码?因为如果一个
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']]