2013-10-08 2 views
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() 
+3

* Прежде всего, вы должны добавить комментарии, чтобы объяснить, что делает код. – SethMMorton

+0

Этот код не является «сложным» вообще. Я даже не знаю, как правильно кодировать этот язык, хотя я все еще могу читать ваш код совершенно и сразу. Мое мнение таково, что ваш профессор задает вам вопрос «трюк». – Awerealis

+0

Хорошо, английский мой профессор не так велик. Думаю, он хотел сказать, что это слишком запутанно? – user2801066

ответ

0

Этот код выглядит довольно прочным для меня, особенно для начинающего Python. Я видел гораздо хуже.

Если бы я писал это, я думаю, я бы вычислить number2 и number3 только внутри основного 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() 

В дополнение к перемещению х и у координат рандомизации в основной цикл, переместив рекурсивное определение функции ранее в файле, и использовать некоторые более явным имена переменных, я использовал xrange звонки вместо range звонки - тривиальная оптимизация, если вы на Python 2.x. Если вы находитесь на Python 3, range верен. Но это небольшие изменения.

Вы также можете бросить в if пункте перед циклом range(branches) даже не попробовать, если depth равен 1 - это еще одна незначительная оптимизация, хотя и не один, который будет иметь большое значение.

 Смежные вопросы

  • Нет связанных вопросов^_^