生成可能有分支终止的树[Python]

2024-03-28 16:56:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个脚本,该脚本将按以下方式生成一个树:如果有数字:拆分为3个数字:数字//2,数字*2,数字+15。如果数字是奇数:分成2个数字:数字+1,数字*4。这些分支会一直持续,直到一个分支是:大于100,等于6,一个完全平方(数字的平方根是整数)。我有一个问题,有两个或三个不同的条件分支。这是我的密码:

import numpy as np

class Node(object):
    def __init__(self,number,parent):
        self._parent = parent
        self._number = number
        self._satisfied = number > 100 or number == 6 or np.sqrt(number) % 1 == 0
        self._branch1 = None
        self._branch2 = None
        self._branch3 = None
        self._depth = parent.depth + 1 if parent != None else 1

    @property
    def parent(self):
        return self._parent

    @property
    def number(self):
        return self._number

    @property
    def satisfied(self):
        return self._satisfied

    @property
    def depth(self):
        return self._depth

    @property
    def branch1(self):
        return self._branch1

    @branch1.setter
    def branch1(self,value):
        self._branch1 = value

    @property
    def branch2(self):
        return self._branch2

    @branch2.setter
    def branch2(self,value):
        self._branch2 = value

    @property
    def branch3(self):
        return self._branch3

    @branch3.setter
    def branch3(self,value):
        self._branch3 = value

def print_all_chains(node,chain=[]):
    if node.branch1 is None:
        chain.append(node.number)
        print '{0}: {1}'.format(node.satisfied, chain)
    else:
        print_all_chains(node.branch1, chain[:] + [node.number])
        print_all_chains(node.branch2, chain[:] + [node.number])
        print_all_chains(node.branch3, chain[:] + [node.number])

def make_daughters(number):
    if number % 2 == 0: #even
        daughters = [number // 2, number * 2, number + 15]
    else:
        daughters = [number + 1, number * 4, None]
    return daughters

def build_tree(node, maxDepth):
    if not node.satisfied and node.depth<maxDepth:
        daughters = make_daughters(node.number)
        node.branch1 = Node(daughters[0], node)
        build_tree(node.branch1,maxDepth)
        node.branch2 = Node(daughters[1], node)
        build_tree(node.branch2,maxDepth)
        node.branch3 = Node(daughters[2], node)
        build_tree(node.branch3, maxDepth)

def find_decay(number):
    root = Node(number,None)
    build_tree(root,maxDepth=3)
    print_all_chains(root)

if __name__ == '__main__':
    find_decay(int(raw_input('Number: ')))

Tags: selfnonenodenumberreturnvaluedef数字
2条回答

为什么不使用列表来保存分支信息?然后可以用这种方式重写,而无需在双分支情况下添加None类型的元素。你知道吗

daughters = make_daughters(node.number)
node.branch = [Node(d, node) for d in daughters]

无需担心类型元素

问题出现在make_daughters的奇数情况下:添加一个None作为第三个参数,然后创建一个新的Node,并尝试在None上运行sqrt方法。你知道吗

修改了以下部分以解决此问题:

def print_all_chains(node,chain=[]):
    if node.branch1 is None:
        chain.append(node.number)
        print '{0}: {1}'.format(node.satisfied, chain)
    else:
        if node.branch1:  # print only if it's a valid branch
            print_all_chains(node.branch1, chain[:] + [node.number])
        if node.branch2:  # print only if it's a valid branch
            print_all_chains(node.branch2, chain[:] + [node.number])
        if node.branch3:  # print only if it's a valid branch
            print_all_chains(node.branch3, chain[:] + [node.number])

def make_daughters(number):
    if number % 2 == 0: #even
        daughters = [number // 2, number * 2, number + 15]
    else:
        daughters = [number + 1, number * 4]  # don't send None
    return daughters

def build_tree(node, maxDepth):
    if not node.satisfied and node.depth<maxDepth:
        daughters = make_daughters(node.number)
        node.branch1 = Node(daughters[0], node)
        build_tree(node.branch1,maxDepth)
        node.branch2 = Node(daughters[1], node)
        build_tree(node.branch2,maxDepth)
        if len(daughters) > 2: # make sure you have the third element
            node.branch3 = Node(daughters[2], node)
            build_tree(node.branch3, maxDepth)

相关问题 更多 >