У меня есть текущий проект по изучению последовательности Фибоначчи, это просто личный проект, я создал двоичный древовидный класс
который создает двоичное дерево графа вызовов Фибоначчи, поэтому для f(3)
я генерирую дерево:
я хочу создать метод моего класса дерева
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 принимают значение дочерних узлов правого узла корня.