Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的树:递归子级创建_Python_Recursion_Tree - Fatal编程技术网

python中的树:递归子级创建

python中的树:递归子级创建,python,recursion,tree,Python,Recursion,Tree,我有一个名为rectangle的类,它有两个参数(SX和SZ)。我需要做一个函数,将第一个矩形分成两部分,在更宽的维度上的随机位置有一条直线,然后这两个新矩形将被分成两个,然后是四个,等等。我使用一个简单的树结构和这样的函数: def devide(self): if (self.SX>self.SZ): #check which dimension is bigger temp=randint (int(self.SX/4), int

我有一个名为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()  
对我来说重要的是:

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

  • 如何访问最小的孩子(例如,让他们进入阵列)


我是编程新手,尤其是Python。谁能帮帮我吗?

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


此外,在对象上调用
divide()
不会增加其自身的
级别,因此您永远不会脱离循环。您应该检查树的末端叶子上的标高。

addChild(向上)和addChild(向下)是什么意思?您可以将一个包含自身级别的整数关联到每个矩形,这要简单得多。如果您想在生成新矩形时限制树的深度,只需计算以下结果:2^h->树的深度。

也许您正在寻找类似的结果:(它是一个双链接的)(父知道子,子知道父)二叉树

!/usr/bin/python3.2
随机输入
类矩形:
定义初始值(自身、宽度、高度、父项=无):
self.width=宽度
自我高度=高度
self.parent=parent
self.children=[]
@财产
def液位(自身):
如果不是self.parent,则返回0,否则返回1+self.parent.level
def拆分(自):
if self.children:引发异常(“已拆分”)
比率=random.random()*.5+.25#在1/4和3/4之间分割
如果self.width>self.height:
宽度=整数(比率*自身宽度)
self.children=[矩形(宽度、self.height、self),
矩形(self.width-宽度、self.height、self)]
其他:
高度=整数(比率*自身高度)
self.children=[矩形(self.width、height、self),
矩形(self.width,self.height-height,self)]
def splitUntilLevel(自身、最大级别):

如果maxLevel要增加对级别数的限制,只需通过如下关键字将其传递到divide函数中:
def divide(矩形,Max_levels=5)
,然后递归调用中的每次迭代都要这样做:“Max_level-1”,并且在
Max_level
达到0时停止拒绝。这只是添加一个新节点(向上或向下调用)作为一个实际节点的子节点-我需要这个函数来处理一些图形内容,这就是为什么这样调用它。感谢您使用新整数的想法,我想我会使用它。只是…哇。非常感谢您,您的代码是如此优雅和明确。它将非常有用,我非常感谢。
def level(self): 
    root=self
    a=0
    while root.isRoot()==False: 
        a+=1
        root=root.getParent()
    return a
#! /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)