您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么利用Python繪制科赫曲線”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么利用Python繪制科赫曲線”吧!
函數作為一種代碼封裝, 可以被其他程序調用,當然,也可以被函數內部代碼調用。這種函數定義中調用函數自身的方式稱為遞歸。就像一個人站在裝滿鏡子的房間中,看到的影像就是遞歸的結果。遞歸在數學和計算機應用上非常強大,能夠非常簡潔地解決重要問題。
數學上有個經典的遞歸例子叫階乘,階乘通常定義如下:
n!= n(n- 1)(n- 2)…(1)
為了實現這個程序,可以通過一個簡單的循環累積去計算階乘。觀察 5! 的計算,如果去掉了 5,那么就剩下計算 4!,推廣來看,n!=n(n-1)!。 實際上,這個關系給出了另一種表達階乘的方式:
當 n = 0 時,n! = 1;否則,n! = n(n - 1)!
這個定義說明 0 的階乘按定義是 1,其他數字的階乘定義為這個數字乘以比這個數字小 1 數的階乘。遞歸不是循環,因為每次遞歸都會計算比它更小數的階乘,直到 0!。0! 是已知的值,被稱為遞歸的基例。當遞歸到底了,就需要一個能直接算出值的表達式。
階乘的例子揭示了遞歸的兩個關鍵特征:
(1) 存在一個或多個基例,基例不需要再次遞歸,它是確定的表達式。
(2) 所有遞歸鏈要以一個或多個基例結尾。
數學歸納法和遞歸都利用了遞推原理,本質是相同的。在證明一個與自然數相關的命題 P(n) 時,數學歸納法采用如下步驟。
(1) 證明當 n 取第一個值 n0 時命題成立。
(2) 假設當 nk ( k ≥ 0, k 為自然數 ) 時命題成立,證明當 n=nk+1 時命題也成立。
綜合 (1) 和 (2),對一切自然數 n( n ≥ n0),命題 P(n) 都成立。
以階乘計算為例,可以把階乘寫成一個單獨的函數,則該函數如下所示:
def fact(n): if n == 0: return 1 else: return n * fact(n - 1) num = eval(input("請輸入一個整數:")) print(fact(abs(int(num))))
fact() 函數在其定義內部引用了自身,形成了遞歸過程(如第 5 行)。無限制的遞歸將耗盡計算資源,因此,需要設計基例使得遞歸逐層返回。fact() 函數通過 if 語句給出了 n 為 0 時的基例,當 n==0,fact() 函數不再遞歸, 返回數值 1,如果 n!=0,則通過遞歸返回 n 與 n-1 階乘的乘積。
由于負數和小數通過減 1 無法到達遞歸的基例 (n==0), 代碼第 8 行通過 abs() 和 int() 函數將用戶輸入轉變成非負整數,該程序輸出效果如下:
請輸入一個整數:5
120
請輸入一個整數:6.789
720
遞歸遵循函數的語義,每次調用都會引起新函數的開始,表示它有本地變量值的副本,包括函數的參數。每次函數調用時,函數參數的副本會臨時存儲,遞歸中各函數再運算自己的參數,相互沒有影響。當基例結束運算并返回值時,各函數逐層結束運算,向調用者返回計算結果。
使用遞歸一定要注意基例的構建,否則遞歸無法返回將會報錯。
對于用戶輸入的字符串 s,輸出反轉后的字符串。
解決這個問題的基本思想是把字符串看作一個遞歸對象。長字符串由較短字符串組成,每個小字符串也是一個對象。假如把一個字符串看成僅由兩部分組成:首字符和剩余字符串。如果將剩余字符串與首字符交換,就完成了反轉整個字符串,代碼如下:
def reverse(s): return reverse((s[1:]) + s[0])
觀察這個函數的工作過程。s[0] 是首字符,s[1:] 是剩余字符串,將它們反向連接,可以得到反轉字符串。執行這個程序,結果如下:
def reverse(s): return reverse(s[1:]) + s[0] reverse("abc")
return reverse(s[1:]) + s[0]
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
這個錯誤表明系統無法執行 reverse() 函數創建的遞歸,這是因為 reverse() 函數沒有基例,遞歸層數超過了系統允許的最大遞歸深度。默認情況下,當遞歸調用到 1000 層,Python 解釋器將終止程序。遞歸深度是為了防止無限遞歸錯誤而設計的,當用戶編寫的正確遞歸程序需要超過 1000 層時,可以通過如下代碼設定:
import sys sys.setrecursionlimit(2000) # 2000 是新的遞歸層數
reverse() 超過遞歸深度是因為沒有設計基例。字符串反轉中的遞歸調用總是使用比之前更短的字符串,因此,可以把基例設計為字符串的最短形式,即空字符串。
完整代碼如下:
def reverse(s): if s == "": return s else: return reverse(s[1:]) + s[0] str = input("請輸入一個字符串:") print(reverse(str))
程序執行結果如下:
請輸入一個字符串:Python程序設計
計設序程nohtyP
這是一個采用遞歸方法繪制科赫曲線的實例,分形幾何采用類似遞歸的核心思想。
自然界有很多圖形很規則,符合一定的數學規律, 例如,蜜蜂的蜂窩是天然的等邊六角形等。科赫曲線在眾多經典數學曲線中非常著名,由瑞典數學家馮。科赫( H-V-Koch )于 1904 年提出,由于其形狀類似雪花,也被稱為雪花曲線。
科赫曲線的基本概念和繪制方法如下:
正整數 n 代表科赫曲線的階數,表示生成科赫曲線過程的操作次數。科赫曲線初始化階數為 0,表示一個長度為 L 的直線。對于直線 L,將其等分為 3 段,中間一段用邊長為 L/3 的等邊三角形的兩個邊替代,得到 1 階科赫曲線,它包含 4 條線段。進一步對每條線段重復同樣的操作后得到 2 階科赫曲線。繼續重復同樣的操作 n 次可以得到 n 階科赫曲線,如下圖所示:
科赫曲線屬于分形幾何分支,它的繪制過程體現了遞歸思想,繪制過程代碼如下:
import turtle def koch(size, n): if n == 0: turtle.fd(size) else: for angle in [0, 60, -120, 60]: turtle.left(angle) koch(size / 3, n - 1) def main(): turtle.setup(800, 400) turtle.speed(0) # 控制繪制速度 turtle.penup() turtle.goto(-300, -50) turtle.pendown() turtle.pensize(2) koch(600, 6) # 0階科赫曲線長度,階數 turtle.hideturtle() main()
程序執行結果如下:
n 階科赫曲線的繪制相當于在畫筆前進方向的 0°、60°、-120° 和 60° 分別繪制 n-1 階曲線。上述代碼中 main() 函數設置了一些初始參數,如果希望控制繪制科赫曲線的速度,可以采用 turtle.speed() 函數增加或減少速度。
科赫曲線從一條直線繪制開始,如果從倒置的三角形開始將更有趣。替換前面代碼中的 main() 函數,代碼如下:
import turtle def koch(size, n): if n == 0: turtle.fd(size) else: for angle in [0, 60, -120, 60]: turtle.left(angle) koch(size / 3, n - 1) def main(): turtle.setup(600, 600) turtle.speed(1000) turtle.penup() turtle.goto(-200, 100) turtle.pendown() turtle.pensize(2) level = 5 koch(400, level) turtle.right(120) koch(400, level) turtle.right(120) koch(400, level) turtle.hideturtle() main()
程序執行結果如下:
分形幾何學是數學的一個分支,以不規則幾何形態為研究對象。分形以自相似結構為基礎,通過無限遞歸方式展示復雜表面下的內在數學秩序。分形幾何不僅展示了數學之美,也揭示了世界的本質,使人們重新審視這個世界:世界是非線性的,分形無處不在。
到此,相信大家對“怎么利用Python繪制科赫曲線”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。