Разделы значений в графе вызовов Фибоначчи (граф вызовов представляет собой двоичное дерево)

У меня есть текущий проект по изучению последовательности Фибоначчи, это просто личный проект, я создал двоичный древовидный класскоторый создает двоичное дерево графа вызовов Фибоначчи, поэтому для f(3)я генерирую дерево:

Binary Tree

я хочу создать метод моего класса дереваget_partitions() который пересекает дерево для создания разделов корневого значения, я рассматриваю здесь слагаемые, которые различаются по порядку, как разныеразделы; поэтому для примера здесь 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

Поскольку в конечном итоге я хочу перечислить все перестановки чисел Фибоначчи, которые Разделите корневое значение, в данном случае 3, поэтому для Перечисление раздела 1будет (2,1),(1,2)или Часть 2будет пронумерована (2,1,0),(2,0,1),(1,2,0),(1,0,2), (0,2,1),(0,1,2)и т. д.…

[Редактировать 1] Меня беспокоят Часть 4и Часть 5в этом примере, поскольку перечисление всех комбинаций этих частей даст дубликатычастей.

Будет ли правильно, если количество комбинаций для заданного корневого значениядаст каталонское число?

Мой Класс дерева:

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

Я был бы признателен за любую помощь в создании метода класса дерева и за любое просветление по математике моей проблемы.

[EDIT:] Как я получаю свои части Сумма всех частей должна равняться Корневое значение:
Часть 1:Взята с уровня 1 (2,1)
Часть 2:Используйте слева child nodeзначение root, но теперь возьмите значения дочерних элементов правого дочернего узла узла root(1, 0), чтобы дать Часть (2,1,0)
Часть 3: Как обход правого дочернего узла корня ] узел исчерпан, перейдите на следующий уровень левого дочернего узла значения root(уровень 2) и используйте эти значения дочерних узлов в качестве первой части раздела ( 1,1), затем возьмите значение правого дочернего узлакорневого узла (1), чтобы получить часть (1,1,1)
Раздел 4:Сохранение начальных значений раздела из предыдущего раздела (1,1), но, как и в случае с Раздел 2, взять значения дочерних элементов правый дочерний узелузла root(1,0), чтобы получить Часть (1,1,1,0)
Часть 5:Как левый дочерний элемент левого дочернего элемента корня имеет дочерние элементы, используйте их как первую часть части (1,0), затем возьмите значение правого дочернего элемента левого дочернего элемента root(1), давая часть (1,0,1), затем возьмите правый дочерний узел корня (1), чтобы дать последняя часть (1,0,1,1)
Часть 6:В качестве части 5 возьмите первую часть части 5 (1,0,1), затем в качестве разделов 2 и 4 принимают значение дочерних узлов правого узла корня.

9
задан Cœur 15 April 2018 в 10:08
поделиться