海龜庫本身帶了一些demo,其中有一個例子是用遞回畫一棵樹,使用的是廣度優先策略,我將其略微改撰寫成了如下maketree2函式,另外我還寫了一個深度優先的版本maketree1。然而在測驗的時候出現了讓我抓狂的情形,maketree1總是比maketree2少畫一層。最后一次的測驗是在每畫一層的時候均在起筆處寫上層序號,依然還是發現maketree1在標注完最后一層之后不作圖,請幫忙解答一下。
from turtle import *
# 深度優先版本
# ltur:當前左分支海龜,length:樹枝長度,angle:左右分支偏轉角度,ratio:下一層長度比例,lenlimit:最短長度限制
def maketree1(ltur, length, angle, ratio, lenlimit=3):
global count, layer # 測驗用
if length>lenlimit:
layer += 1 # 測驗用
print(layer, length)
turlist = [ltur]
rtur = ltur.clone()
ltur.write(str(layer)) # 測驗用
ltur.lt(angle)
rtur.rt(angle)
ltur.fd(length) # 畫出左右分支
rtur.fd(length)
turlist.append(rtur)
# count += 2
# print(count)
for t in turlist:
maketree1(t, length*ratio, angle, ratio, lenlimit)
# count -= 1
# print(count)
layer -= 1
# 廣度優先版本
# lastlist:本層所有分支串列
# currentlist :下一層將要作圖的所有分支
def maketree2(lastlist, length, angle, ratio, lenlimit=3):
global count, layer
if length>lenlimit:
layer += 1
print(layer, length)
currentlist = []
for ltur in lastlist:
ltur.write(str(layer))
ltur.fd(length) # 畫出當前分支
rtur = ltur.clone()
ltur.lt(angle)
rtur.rt(angle)
currentlist.append(ltur)
currentlist.append(rtur)
# count += 2
# print(count)
maketree2(currentlist, length*ratio, angle, ratio, lenlimit)
layer -= 1
# count -= len(currentlist)
# print(count)
def main():
global count, layer
count = 0
firstlen = 200
angle = 65
ratio = 0.6375
lenlimit = 60
t = Turtle()
# t.setundobuffer(None)
t.ht()
t.lt(90)
t.up()
t.bk(firstlen)
t.down()
# tracer(36, 0)
tracer(False)
# 深度優先測驗
layer = 1
t.fd(firstlen)
maketree1(t, firstlen*ratio, angle, ratio, lenlimit)
# 廣度優先測驗
# layer = 0
# maketree2([t], firstlen, angle, ratio, lenlimit)
print('time', time.process_time())
return 'ok'
if __name__=='__main__':
print(main())
mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262659.html
