Python筆記 科赫雪花曲線 計算思維訓練1

2021-08-20 04:57:14 字數 4127 閱讀 2844

提要:基於mooc的「python語言程式設計基礎」,主講人:嵩天。基本算是課本筆記。

邏輯思維:推理和演繹,數學為代表;

實證思維:實驗和驗證,物理為代表;

計算思維:設計和構造,計算機為代表;

概念誕生:2023年,時任美國卡內基-梅隆大學計算機系主任的週以真(jeannette m. wing)教授,提出了計算思維(computational thinking)概念——第一次從思維層面闡述了運用電腦科學的基礎概念,來求解問題、設計系統和理解人類行為的過程。

實踐手段:程式設計,是實踐計算思維的重要手段。

解決思路:抽象實際問題的計算特性、利用計算機求解。

本質:抽象化(abstraction)和自動化(automation)。

在程式設計範濤,計算思維主要反映在如下幾個方面:理解問題的計算特性、將計算特性抽象為計算問題、通過程式語言實現問題的自動求解等。

例項:科赫雪花曲線

看圖:(分別是0階、1階、2階和3階科赫雪花曲線)

分析科赫雪花曲線,發現可分解為基本&可重複的單元;

將這些單元設計為程式語言;

最後,通過計算機自動求解。

通過分析,科赫雪花曲線的「基本&可重複「單元為兩個層次:

- 從0階科赫雪花曲線看出,可將三條邊分解為乙個基本單元——不妨叫它「邊」,的3次重複性問題;

- 從大於0階的科赫雪花曲線可以看出,可將每個邊分為4個基本單元——不妨叫它「尖」,的4次重複性問題;

首先,定計算問題的物件:要計算的問題是「邊」和「尖」,

其次,定計算問題的順序:由「尖」組成「邊」,再由「邊」組成我們需要的「科赫雪花曲線」,

最後,定計算問題的引數:見第三步。

首先,定需要的工具(程式包):我們選擇turtle,

其次,定需要設定的程式框架:我們選擇「函式」,利用其「復用」和「遞迴」的特性,實現計算的」基本&可重複性「單元,

最後,定程式需要的介面引數:乙個是科赫雪花曲線的「階數」,另乙個是科赫雪花曲線的「長度」後者稱作「大小」。

整體**如下:

import turtle                          # 引入決解問題需要的工具——turtle作圖包

# 定義turtle畫筆和畫布的引數

def huabi():

turtle.speed(0) # speed()引數有[0,10]:「0」特殊、代表最快速度,其餘[1,10]值越大、速度越快

turtle.pensize(2) # 設定畫筆寬度為2

turtle.setup(800,800, 100, 10) # setup()引數有4個:前兩個代表畫布的「寬」和「高」,當數值為整數時、表示絕對畫素大小,當小數時、表示站螢幕的比例。後兩個可以省略,預設為螢幕中心位置,代表距離「螢幕左上角」的距離,單位是畫素密度,

turtle.penup() # 抬起畫筆,之後的畫筆動作、就不會產生圖線

turtle.goto(-300, 100) # 以畫布中心點為座標原點(0,0),將畫筆移動到座標(-300,100)處

turtle.pendown() # 落下畫筆,以便畫圖

# 定義「尖」

def koch(size, n):

if n==0: # 0階的科赫雪花曲線就是一條線,大小為輸入的「size」

turtle.fd(size)

else: # 高階科赫雪花曲線

for i in [0, 60, -120, 60]: # turtle在「尖」的四條線上改變的角度,分別為0°,60°,-129°,60°

turtle.left(i) # 對應上邊四個角度,一共需要轉4次彎,畫出本階的四條線,

koch(size/3, n-1) # 每個角度下的乙個邊,對應低一階的客戶雪花曲線的「尖」;至此完成函式本身的迴圈和復用,自動畫出乙個完整的n階「尖」

# 定義「邊」

def sdkoch(size, n): # 完整的科赫雪花曲線由3個「邊」組成,我們以上完成的是乙個由「尖」組成的「邊」,

koch(size, n)

turtle.right(120) # 2行**一組,

koch(size, n)

turtle.right(120)

koch(size, n) # 至此,得到完整的n階科赫雪花曲線

turtle.hideturtle() # 把turtle的游標隱藏

turtle.done() # 結束turtle

# 定義main()主函式

def main(size, n): # 設定引數介面

huabi()

sdkoch(size, n)

main(500, 2) # 在設定引數之後,呼叫主函式

附註:自己的思路

對於我,最難的時函式迴圈和復用部分:一開始把最基本的科赫雪花曲線組分、設為了1階;但是,在推廣到n階時遇到問題,才不得不把基本組分設為0階。

當初的錯誤膽碼及思路:

第一步:寫出最基本組分:1階「尖」

if n == 1:

for i in [0, 60, -120, 60]:

turtle.left(i)

turtle.fd(size/3)

第二部:將基本組分推廣到高階,途徑是利用高一階——2階,的組分

def koch(size, n):

if n == 1:

for i in [0, 60, -120, 60]: # for in()函式,即遍歷取值函式,使得i分別取0,60,-120和60,分別帶入for in()迴圈後邊的程式

turtle.left(i)

turtle.fd(size/3)

else:

koch(size/3, n-1)

顯然,結果錯誤。因為每個高階科赫雪花曲線「尖」的4個線段,每乙個線段都是由低一階科赫雪花曲線的「尖」組成,意味著

koch(size/3, n-1)必須在 for in ()迴圈下。據此修改如下:

def koch(size, n):

if n==1:

for i in [0, 60, -120, 60]:

turtle.left(i)

turtle.fd(size/3)

else:

for i in [0, 60, -120, 60]: # for in()函式,即遍歷取值函式,使得i分別取0,60,-120和60,分別帶入for in()迴圈後邊的程式

turtle.left(i)

koch(size/3, n-1)

但時明顯沒有如下簡單:(我想,最關鍵的時沒有把0階,即三角形,視為科赫雪花曲線的緣故):

def koch(size, n):

if n==0:

turtle.fd(size)

else:

for i in [0, 60, -120, 60]:

turtle.left(i)

koch(size/3, n-1)

Python 科赫雪花繪製

科赫曲線繪製 kochdrawv1.py import turtle def koch size,n size表示繪製科赫曲線的每乙個直線的長度,n表示繪製的階數 if n 0 turtle.fd size 繪製一條直線 else for angle in 0,60,120,60 turtle.le...

python語言程式設計 科赫雪花繪製

通過對python的學習,可以得到較為豐富的影象,科赫雪花正是其中一種。那麼,如何繪製優美的科赫曲線呢?科赫曲線是一種像雪花的幾何曲線,所以又稱為雪花曲線,它是de rham曲線的特例。科赫曲線是出現在海浬格 馮 科赫的 中,是分形曲線中的一種。import turtle def koch size...

Python 科赫雪花小包裹 問題

要求實現的功能 在turtle畫板上隨機位置 不超過畫板 產生隨機大小 合適的大小 的科赫雪花,並且雪花的數量也是隨機的,在 2,10 之間。實現 time 2020 4 13 file chap04.py title 科赫雪花小包裹 問題,要求雪花位置隨機 畫布之內 雪花個數隨機 2,10 之間。...