【发布时间】:2012-03-27 22:34:55
【问题描述】:
我有一个正在进行的项目调查斐波那契数列,这只是一个个人项目,我创建了一个二进制 tree class,它生成了斐波那契调用图的二叉树,所以对于 f(3),我生成了树:
我想创建一个我的tree classget_partitions() 的方法,它遍历树以生成root value 的分区,我在这里将顺序不同的summands 视为不同 分区;因此对于f(3) 的示例,get_partitions() 方法将遍历树并产生:
Partion 1: 2,1
Partion 2: 2,1,0
Partion 3: 1,1,1
Partion 4: 1,1,1,0
Partion 5: 1,0,1,1
Partion 6: 1,0,1,1,0
最终我想枚举分割root value的斐波那契数的每个排列,在这种情况下为3,所以对于Partition 1,枚举将是(2,1),(1,2),或者Partion 2将枚举(2,1,0),(2,0,1),(1,2,0),(1,0,2),(0,2,1),(0,1,2)等等……
[Edit 1] 我担心这个例子中的 Partion 4 和 Partion 5 因为枚举这些分区的所有组合会产生 duplicate 分区。
给定root value 的组合数会产生一个加泰罗尼亚数,这是否正确?
我的Tree class 是:
class FibTree(object):
"""Class which builds binary tree from Fibonacci function call graph"""
def __init__(self, n, parent=None, level=None, i=None):
if level is None:
level = 0
if i is None:
i = 1
self.n = n
self.parent = parent
self.level = level
self.i = i # Node index value
if n < 2:
self.left = None
self.right = None
self.value = n
else:
self.left = FibTree(n - 1, self, level + 1, i*2)
self.right = FibTree(n - 2, self, level + 1, (i*2)+1)
self.value = self.left.value + self.right.value
对于生成树类方法的任何帮助以及对我的问题的数学启发,我将不胜感激。
[编辑:]我如何获得我的分区
所有分区的总和必须为 Root 值:Partion 1: 取自级别 1 (2,1)Partion 2: 使用 left child node 的值 root,但现在取root节点(1,0)的right child node,给(2,1,0)的一个PartionPartion 3:由于root节点的right child node的遍历已经耗尽,遍历到@987654354的下一级root 的 @ 值(级别 2),并将这些子节点值用作分区 (1,1) 的第一部分,然后取 root 节点 (1) 的 right child node 值,得到 @987654359 的分区@Partion 4: 保留前一个分区(1,1) 的初始分区值,但与Partion 2 一样,取root 节点(1,0) 的right child node 的子节点的值,给出一个(1,1,1,0)Partion 5: 的分区作为根的左孩子的左孩子,有孩子,使用这些作为分区的第一部分 (1,0) 然后取右孩子值root (1) 的左子节点,给出到目前为止(1,0,1) 的分区,然后取根(1) 的右子节点,给出(1,0,1,1) 的最后一个分区@
@987654373 @ 作为 Partion 5,取 Partion 5 的第一部分(1,0,1),然后作为 Partion 2 和 4,取根的右节点的子节点的值。
【问题讨论】:
-
问题到底是什么?你被困在哪里了?
-
嗨@svick,生成所有分区排列的方法的伪代码。谢谢
-
有什么理由让
1节点拥有1和0子节点?似乎递归应该在那里终止。如果没有,您可以假设您可以拥有任意多个0孩子,因为他们实际上并没有贡献任何东西。 -
嗨@templatetypedef 对递归斐波那契函数是真实的,在终止点
1节点确实有一个1和0孩子,但正如你所说,它可能是任意的@ 987654382@ children 最终将证明对我没有用,因为它们没有大小,所以我可能需要以某种方式将它们过滤掉。 -
你能分享你是如何生成你的分区的吗...伪代码或者只是英文会很好。我对您如何获得它们感到有些困惑。
标签: python data-structures recursion combinatorics fibonacci