【问题标题】:Tree in python: recursive children creatingpython中的树:递归子创建
【发布时间】:2012-12-29 17:52:02
【问题描述】:

我有一个名为 rectangle 的类,它有两个参数(SX 和 SZ)。我需要做一个函数,将第一个矩形分成两部分,在更宽的维度上随机放置一条线,然后这两个新矩形将分为两部分,然后是四部分,等等。我使用简单的树结构和像这样的函数:

def devide(self):
    if (self.SX>self.SZ):                #check which dimension is bigger
        temp=randint (int(self.SX/4), int(self.SX*3/4))  #generate random from x/4,3x/4           
        left=rectangle(temp, self.SZ)             #create nodes
        right=rectangle(self.SX-temp, self.SZ)
        self.addChild(left) 
        self.addChild(right)
    else:
        temp=randint (int(self.SZ/4), int(self.SZ*3/4))              
        up=rectangle(self.SX, temp)                 
        down=rectangle(self.SX, self.SZ-temp)
        self.addChild(up)
        self.addChild(down)

    for c in self.getChilds():
        while (c.level()<3):     ####why doesn't it work?:(
            c.devide()  

而函数level()——它应该(但它没有)返回根节点和实际节点之间有多少层的值:

def level(self): 
    root=self
    a=0
    while root.isRoot()==False: 
        a+=1
        root=root.getParent()
    return a

对我来说重要的事情是:

  • 如何限制这些划分(例如,只有 1+2+4+8 个节点)?我的意思是,Python 中没有静态变量,我的函数 level() 无法正常工作。

  • 如何获得最小的孩子的访问权限(例如,将他们放在数组中)

我是编程新手,尤其是 Python。有人可以帮帮我吗?

【问题讨论】:

  • 要添加对级别数的限制,只需通过类似这样的关键字将其传递给divide 函数:def divide( rectangle, Max_levels=5 ) 然后递归调用中的每次迭代都这样做,使得 ` Max_level - 1 ` 并在 max_level 达到 0 时停止拒绝。

标签: python recursion tree


【解决方案1】:

也许你正在寻找这样的东西:(它是一个双链(父母知道孩子,孩子知道父母)二叉树)

#! /usr/bin/python3.2

import random

class Rectangle:
    def __init__ (self, width, height, parent = None):
        self.width = width
        self.height = height
        self.parent = parent
        self.children = []

    @property
    def level (self):
        return 0 if not self.parent else 1 + self.parent.level

    def split (self):
        if self.children: raise Exception ('Already split')
        ratio = random.random () * .5 + .25 #split between 1/4 and 3/4
        if self.width > self.height:
            width = int (ratio * self.width)
            self.children = [Rectangle (width, self.height, self),
                Rectangle (self.width - width, self.height, self) ]
        else:
            height = int (ratio * self.height)
            self.children = [Rectangle (self.width, height, self),
                Rectangle (self.width, self.height - height, self) ]

    def splitUntilLevel (self, maxLevel):
        if maxLevel <= self.level: return
        self.split ()
        for child in self.children: child.splitUntilLevel (maxLevel)

    def __str__ (self):
        s = '{}{} x {}\n'.format (' ' * (2 * self.level), self.width, self.height)
        for child in self.children: s += str (child)
        return s

r = Rectangle (100, 100)
r.splitUntilLevel (3)
print (r)

【讨论】:

  • 只是...哇。非常感谢,您的代码是如此优雅和明确。这将是有用的,我真的很感激。
【解决方案2】:

应该是a += 1,而不是a = +1

另外,对一个对象调用divide() 不会增加它自己的level,所以你永远不会跳出循环。你应该检查树的末端叶子的水平。

【讨论】:

    【解决方案3】:

    addChild(up) 和 addChild(down) 是什么?您可以将每个矩形关联到一个包含自身级别的整数,这更容易,如果您想在生成新矩形时限制树的深度,只需评估以下结果:2^h h-> 树的深度。

    【讨论】:

    • 它只是将一个新节点(称为向上或向下)作为子节点添加到实际节点 - 我需要这个函数来处理一些图形内容,这就是为什么这样称呼它的原因。感谢您提出这个新整数的想法,我想我会使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多