Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.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
使用L-systems和Python生成树_Python_Turtle Graphics_L Systems - Fatal编程技术网

使用L-systems和Python生成树

使用L-systems和Python生成树,python,turtle-graphics,l-systems,Python,Turtle Graphics,L Systems,我试图用L系统生成一个简单的树。但是,当我运行我拥有的代码时: import turtle def generate(length): sentence = "F" for j in range(1, length): for i in sentence: if i == "F": sentence += "FF+[+F-F-F]-[-F+F+F]" print(sentence)

我试图用L系统生成一个简单的树。但是,当我运行我拥有的代码时:

import turtle


def generate(length):
    sentence = "F"
    for j in range(1, length):
        for i in sentence:
            if i == "F":
                sentence += "FF+[+F-F-F]-[-F+F+F]"

        print(sentence)


    gen = turtle.Turtle()
    window = turtle.Screen()
    gen.left(90)

    for k in sentence:
        if k == "F":
            gen.forward(10)
        elif k == "+":
            gen.right(10)
        elif k == "-":
            gen.left(10)
        elif k == "[":
            location = gen.position()
        elif k == "]":
            gen.setposition(location)
我在乌龟的窗户上看到一个奇怪的纹理图案:


如何生成所需的结果?

您的
+=
操作将产生式规则的应用附加到字符串,但其思想是用产生式规则的结果替换出现的
“F”
字符

您可以使用,它将替换子字符串的每次出现。您在编辑之前使用了此选项,但没有将函数的返回值赋回到原始的
语句
变量(
replace
不起作用,字符串是不可变的)

无论如何,额外的内部循环都是不必要的

另一个要点是:产生式规则是递归的,因此单个
location
变量的存储空间不足,无法“记住”可能已执行的推送序列

下面是在多次迭代中应用产生式规则后的
语句
变量的摘录:

...[-FF+[+F-F-F]-[-F+F+F]+...
很明显,在遇到
]
之前,这有两个连续的
[
操作。这种巢穴可以任意生长。数据结构是跟踪嵌套递归位置的最佳方法(
location
只能跟踪最后一个位置,并且当两个推送操作连续发生时,状态将被破坏)

每当遇到
[
操作时,推送堆栈上的位置(在Python中表示为一个列表,该列表只使用
append
(用于推送)和
pop
,不使用任何参数删除列表的背面)。每当遇到
]
操作时,弹出堆栈并将海龟的位置设置为该位置

作为次要的一点,最好将硬编码的值保留在代码之外;将所有设置/配置变量分组到块的顶部。如果您使用的是函数,请使用以下参数

以下是一个工作版本:

import turtle

generations = 3
size = 10
rule = ("F", "FF+[+F-F-F]-[-F+F+F]")
sentence = "F"
positions = []
gen = turtle.Turtle()
gen.speed(10)
gen.left(90)

for i in range(generations):
    sentence = sentence.replace(*rule)

for op in sentence:
    if op == "F":
        gen.forward(size)
    elif op == "+":
        gen.right(size)
    elif op == "-":
        gen.left(size)
    elif op == "[":
        positions.append(gen.position())
    elif op == "]":
        gen.setposition(positions.pop())

turtle.exitonclick()

>>>generate(3),3是字符串的长度,也就是treeOK的复杂度,当我运行时,我无法获得您的视觉效果。我在控制台上收到“F”的垃圾邮件,窗口立即关闭。你能发布你用来生成你发布的图像的确切代码吗?我可以肯定地说,
句子.replace
并没有做你认为它做的事情——它用第二个参数替换第一个参数的每一次出现,但它没有做到位。除此之外,我不确定你想达到什么目的。我在if I==“F”语句中犯了一个小错误,替换句子。将(I,“FF+[+F-F-F]-[-F+F]])替换为句子+=“FF+[+F-F-F]-[-F+F]-[-F+F]”我认为这也不是你想要的。请编辑您的帖子以提供这些更新。好的,我编辑了它,我将如何改进我的代码以获得所需的结果?