0

再帰を使用して、ツリーなどの特定の種類の単純な分岐構造を模倣するクラスのプログラムを作成しました。教授に見せるまで、自分のコードは素晴らしいと思っていました。彼は私のコードが複雑すぎると言い、単純化する必要があると言いました。それらを離す以外に、他に何ができるかわかりません。任意のヒント?(私は初心者なので、お手柔らかにお願いします。) このプログラムは、太さ、枝の数、座標が異なる複数の木を作成します。

import random 
import turtle
##I'm using a python module called turtle to visualize results
p1 = turtle.Pen()
##Creates a pen
p1.tracer(True)
## Shows pen drawing
p1.up()
p1.left(90)

d=random.randint(0,2)
## Varying thickness of branch
length=150
##Length of branches
contract=random.uniform(.5,1)
## Varying degree of contraction
branch=random.randint(5,8)
## Varying amount of branches
first=random.randint(30,70)
## Varying first degree of branch
next=random.randint(1,30)
## Varying degree between each branches
number1=random.randint(10,20)
number2=random.randint(-100,100)
number3=random.randint(-100,100)
# Range of numbers used for coordinates 
def drawFern1(pen, depth, length, contractBy, branches, firstBranchAngle, nextBranchAngle):
    if depth > 0:
       #Pen's Position and heading
       heading = pen.heading()
       position = pen.position()
       pen.width(depth)
       pen.forward(length)
       pen.left(firstBranchAngle)
       for i in range(branches):
        drawFern1(pen, depth-1, contractBy*length, contractBy,branches,firstBranchAngle,nextBranchAngle)
        pen.right(nextBranchAngle)
      pen.setheading(heading)
      pen.setposition(position)
# Ensures that multiple trees are created each at different coordinates. 
for i in range(number1):
   p1.sety(number2)
   p1.setx(number3)
   p1.down()
   drawFern1(p1,d,length,contract,branch,first,next)
   number2 = random.randint(-100,100)
   number3 = random.randint(-100,100)
   p1.up()
4

2 に答える 2

0

このコードは、特に Python の初心者にとっては、かなりしっかりしているように見えます。私はもっ​​と悪いことを見てきました。

私がそれを書いていたら、私は計算number2number3てメインforループの中でだけだと思います - あなたがここに持っているようなプライミング定義はしばしばwhileループに便利ですが、この場合は必要ありません. また、より説明的な変数名を使用しようとします。問題のステートメントによっては、ランダムに生成されdepthた値が少なくとも 1 である必要がある場合depthがあります。0 として生成された場合、何も描画されません。

これの私のバージョンは次のようになります。

import random 
import turtle

def drawFern(pen, depth, length, contraction, branches, firstBranchAngle, nextBranchAngle):
    if depth > 0:
        # Pen's Position and heading
        heading = pen.heading()
        position = pen.position()
        pen.width(depth)
        pen.forward(length)
        pen.left(firstBranchAngle)
        for i in xrange(branches):
            drawFern(pen, depth-1, contraction*length, contraction, branches, firstBranchAngle, nextBranchAngle)
            pen.right(nextBranchAngle)
        pen.setheading(heading)
        pen.setposition(position)

# I'm using a python module called turtle to visualize results
# Creates a pen
pen = turtle.Pen()
#  Shows pen drawing
pen.tracer(True)
pen.up()
pen.left(90)

# Configure initial state
# Varying depth of recursive fern
depth = random.randint(1,2)
# Length of branches
length = 150
# Varying degree of contraction
contraction = random.uniform(.5,1)
# Varying number of branches
branches = random.randint(5,8)
# Varying first degree of branch
first_angle = random.randint(30,70)
#  Varying degree between each branches
next_angle = random.randint(1,30)

number_of_trees =random.randint(10,20)

for i in xrange(number_of_trees):
    new_x = random.randint(-100, 100)
    new_y = random.randint(-100, 100)
    pen.setx(new_x)
    pen.sety(new_y)   
    pen.down()
    drawFern(pen, depth, length, contraction, branches, first_angle, next_angle)
    pen.up()

x 座標と y 座標のランダム化をメイン ループに移動し、再帰関数定義をファイルの前に移動し、より明示的な変数名を使用することに加えてxrange、呼び出しの代わりにrange呼び出しを使用しました。 Python 2.x. Python 3 を使用している場合rangeは、正しいです。しかし、これらはマイナーな変更です。

if equals 1 を試行しないようifに、ループの前に節を挿入することもできます。これも小さな最適化ですが、大きな違いはありません。range(branches)depth

于 2013-10-08T09:32:50.810 に答える