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