使函数递归

时间:2016-11-05 17:26:35

标签: python recursion turtle-graphics

我正在尝试将下面的函数转换为递归函数但我在尝试时遇到错误。

TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'

def turtle_spiral(forward):

    minus = 8

    t = turtle.Turtle()

    t.pendown()

    t.shape("turtle")
    #while forward > 10:

    randm = random.randrange(5)
    colours = ["blue", "orange", "yellow", "green",   "purple","black","red","pink"]

    t.goto(-100,0)

    if forward <= 10:
        return False

    else:
        t.color(colours[randm])
        #t.speed(10)
        t.fd(turtle_spiral(forward*minus))
        #t.circle(forward, 360)
        t.right(90)
        #forward -= minus


turtle_spiral(100)

wd.mainloop()

2 个答案:

答案 0 :(得分:0)

我已经开始修改您的代码以执行我想要做的:

import turtle
import random

def turtle_spiral(forward):

    minus = 8
    randm = random.randrange(5)
    colours = ["blue", "orange", "yellow", "green",   "purple","black","red","pink"]

    if forward <= 10:
        return 0
    else:
        t.color(colours[randm])
        t.right(90)
        t.fd(forward)
        return turtle_spiral(forward-minus)

t = turtle.Turtle()

t.pendown()

t.shape("turtle")
turtle_spiral(100)

递归的关键是定义递归的结束点。在你的情况下,当乌龟被要求前进一个小于10的距离时。在结束点,递归函数不应该调用自己而只是返回。

在其他情况下,我们希望函数在某个时刻调用自身,并使用一个参数使其更接近终点。在您的情况下,此参数为forward-minus,此值将越来越接近结束条件,turtle_spiral递归调用自身越多。

答案 1 :(得分:0)

尽管John Sharp很好地分析了你的代码,想出你想让你的乌龟做什么,但我还是读了一下你的注释代码,想出你真正希望你的乌龟可以做的事情:

turtle_spiral()

我还改变了一些风格 - 看看它们是否对你有意义。例如:colors无需返回值,也无需查看结果;从正在运行的代码中获取全局定义,如turtle_spiral()数组;将乌龟和其他信息传递给function run(){ document.body.style.backgroundColor = 'red'; alert('Contratulations!'); }作为参数 - 通过事件计时器,您可以一次运行多个这样的事件;保持你的乌龟不可见,直到你到达起点然后揭示它。

enter image description here