2016-11-05 194 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