2016-11-05 96 views
-3

我想将下面的函数转换为递归函数,但是当我尝试它时,我总是收到一个错误。使函数递归

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() 
+0

此代码中没有使用“*”运算符。 – chepner

+0

你显示的代码根本不是递归的,所以我们无法弄清楚你有什么递归问题,因为没有递归来看。由于存在缩进错误,我们甚至无法运行已发布的代码。请发布您实际遇到问题的代码以及异常的完整回溯。 – Blckknght

+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) 

以递归的关键是确定终点(s)你的递归。就你而言,就是当龟被要求前进的距离小于10时。在最后一点,递归函数不应该调用它自己,而只是返回。

在其他情况下,我们希望函数在某个点调用它自己,使它更接近终点。在你的情况下,这个参数是forward-minus,这个值将越来越接近结束条件,更多turtle_spiral递归调用它自己。

+0

非常感谢你,对不起我的乱码 –

+0

没问题!随着你越来越习惯你的代码变得不那么凌乱了:) –

0

虽然约翰·夏普很好地分析你的代码拿出你想你的龟做的,我在字里行间,又名你注释掉的代码,拿出你真的希望你的龟可以这样做:

from turtle import Turtle, Screen 
from random import choice, randrange 

LENGTH = 200 
LIMIT = 10 
DELTA = 16 

colors = ["blue", "orange", "cyan", "green", "purple", "black", "red", "magenta"] 

def turtle_spiral(turtle, length, delta, limit): 

    if length < limit: 
     return 

    extent = 360/delta 

    for radius in range(delta): 
     turtle.circle(length - radius, extent=extent) 
     if randrange(delta) == 0: 
      turtle.color(choice(colors)) 

    turtle_spiral(turtle, length - delta, delta, limit) 

yertle = Turtle(shape="turtle", visible=False) 

yertle.speed("fastest") 

yertle.penup() 
yertle.sety(-LENGTH) 
yertle.pendown() 

yertle.showturtle() 

turtle_spiral(yertle, LENGTH, DELTA, LIMIT) 

screen = Screen() 
screen.exitonclick() 

我也抛出了一些风格的变化 - 看看他们是否对你有意义。例如:不需要turtle_spiral()返回一个值,没有看到结果;从运行代码中获取全局定义,如colors阵列;将乌龟和其他信息传递给turtle_spiral()作为参数 - 使用事件计时器,您可以一次运行超过一个的计时器;保持你的乌龟不可见,直到你到达起点然后揭示它。

enter image description here