我一直试图解决这个问题 - 我试图使用二叉树进行此实现,并使用递归。
对于这个作业,我试图得到一个关于Game of Nim的所有可能性的列表:到目前为止我有分裂功能(感谢Eric Duminal):
def split(n):
return [[i, n - i] for i in range(1, (n + 1) // 2)]
返回列表列表,例如:n = 6将返回[[1,5],[2,4]],这就是我想要的。 (没有重复,非零) 现在,我需要基本上将分割函数用于3或更大的任何东西(因为2和1是“基础”案例“)。
例如:我需要在二叉树型节点中生成这样的东西:
对于n = 6
\-[6] Max
+ [1, 5]
| + [1,1,4]
| \-[1, 1, 1, 3] Min
| \-[1, 1, 1, 1, 2] Max
| \-[1, 2, 3] Max
| \-[1, 1, 2, 2] Min
\-[2, 4] Min
\-[1, 2, 3] Max
\-[1, 1, 2, 2] Min
因此,在[1,5]和[2,4]中,我需要生成所有可能性并将它们放在同一个列表中。 - 我会如何使用递归来解决这类问题?每个拆分不能包含重复,非空集。 感谢您的时间和帮助!
答案 0 :(得分:1)
在我看来,这是基本的分区问题。你可以定义一个函数有两个参数n和m,其中n只是你的数字,m是使用的部分。因此,partition(n,m)将等于使用最大为m的整数对n-m进行分区的方式的数量以及使用整数到m-1来分割n的方式的数量。你仍然可以使用你的功能拆分来获得你的结果。