I'm trying to implement a solution for following:
interface Monarchy {
void birth(String child, String parent);
List<String> getOrderOfSuccession();
}
king
/ \
a1 a2
/ \ / \
b1 b2 c1 c2
/ \ \
d1 d2 d3
Order of Succession: king -> a1 -> b1 -> d1 -> d2 -> b2 -> d3 -> a2 -> c1 -> c2
This is my solution:
class Person:
name = ""
children = []
is_alive = True
def __init__(self, name):
self.name = name
class MonarchyNew:
head = None
members = dict()
def __init__(self, name):
p = Person(name)
self.head = p
self.members[name] = p
def birth(self, child_name: str, born_to: str) -> 'MonarchyNew':
parent = self.members[born_to]
child_node = Person(child_name)
parent.children = [child_node]
self.members[child_name] = child_node
return self
def __dfs_core(self, head: Person, succession: List[str]):
if head.is_alive:
succession.append(head.name)
for c in head.children:
self.__dfs_core(c, succession)
def get_order_of_succession(self) -> List[str]:
succession = []
self.__dfs_core(self.head, succession)
return succession
But it is creating infinite childs when I'm trying to run it like this:
m = MonarchyNew("Jake")
m.birth("Catherine", "Jake")
print(m.get_order_of_succession())
Error that I'm getting: maximum recursion depth exceeded while calling a Python object
I've found out, this is happening when doing parent.children = [child_node]
. child_node
is getting added in children
array of the child
[ie: 'Catherine' is getting added as children to 'Catherine'] recursively, creating a infinite loop.
Resulting in: Jake -> Catherine -> Catherine -> Catherine -> Catherine X [infinite]
I'm nnot able to figure out why is this happening. Can someone please help?
CodePudding user response:
You have defined children
as a static variable of Person
, i.e. there is only one list that is shared by all instances of Person
. That is not what you want. So define children
as an instance attribute in the constructor:
def __init__(self, name):
self.name = name
self.children = []