[LeetCode] 由 「分形" 所想

分形思想和遞歸思想有區別麼?html


1、簡單例子

函數調用本身,簡化了理解邏輯,但其餘處處都是問題。python

#%%
def listsum(numList):
    if len(numList) == 1:
        return numList[0]
    else:
        return numList[0] + listsum(numList[1:])

print(listsum([1,3,5,7,9]))

   

2、分形的思想

中文版本Tutorial: turtle --- 海龜繪圖函數

無限分叉樹

import turtle
deftree(branchLen,t): if branchLen > 5:
# 出發後作出一系列動做,最後要回到原點 t.forward(branchLen)
t.right(
20) tree(branchLen-15,t) t.left(40) tree(branchLen-15,t) t.right(20)
t.backward(branchLen)
def main(): t = turtle.Turtle() myWin = turtle.Screen()
t.left(
90) t.up() t.backward(100) t.down() t.color("green")
tree(
100,t) myWin.exitonclick()
main()

輸出:spa

 

謝爾賓斯基三角形

import turtle

def drawTriangle(points,color,myTurtle):
    myTurtle.fillcolor(color)
    myTurtle.up()
    myTurtle.goto(points[0][0],points[0][1])
    myTurtle.down()
    myTurtle.begin_fill()
    myTurtle.goto(points[1][0],points[1][1])
    myTurtle.goto(points[2][0],points[2][1])
    myTurtle.goto(points[0][0],points[0][1])
    myTurtle.end_fill()

def getMid(p1,p2):
    return ( (p1[0]+p2[0]) / 2, (p1[1] + p2[1]) / 2)
#########################################################################
def sierpinski(points,degree,myTurtle): colormap = ['blue','red','green','white','yellow', 'violet','orange'] drawTriangle(points,colormap[degree],myTurtle) if degree > 0: sierpinski([points[0], getMid(points[0], points[1]), getMid(points[0], points[2])], degree-1, myTurtle) sierpinski([points[1], getMid(points[0], points[1]), getMid(points[1], points[2])], degree-1, myTurtle ) sierpinski([points[2], getMid(points[2], points[1]), getMid(points[0], points[2])], degree-1, myTurtle) def main(): myTurtle = turtle.Turtle() myWin = turtle.Screen()
myPoints
= [[-100,-50],[0,100],[100,-50]] sierpinski(myPoints,3,myTurtle)
myWin.exitonclick() main()

輸出:code

 

3、漢諾塔遊戲

核心思想

要把fromPole最下面的"盤子「轉移到toPole,就先要解決:orm

要把fromPole的height-1的"盤子「轉移到withPole;在此以後:htm

把withPole的」盤子「也轉移到toPole。blog

 

對應代碼

def moveDisk(fp,tp):
  print("moving disk from",fp,"to",tp)

def moveTower(height,fromPole, toPole, withPole):
  if height >= 1:
    moveTower(height-1,fromPole,withPole,toPole)
    moveDisk(fromPole,toPole)
    moveTower(height-1,withPole,toPole,fromPole)

 

 

 

模擬棧幀 之 二叉樹遍歷遞歸


 

/* implement */遊戲

相關文章
相關標籤/搜索