程式設計與實體運算
課程總覽
教學軟體:Scratch、code.org
課程規劃:
魔幻水族箱/5
聲控遊戲/4
樂透抽籤機/5
海龜畫圖/4
單元ㄧ:魔幻水族箱
單元二:聲控遊戲
利用音量變化來控制遊戲中的主角作出相應動作,稱為「聲控遊戲」,與鍵盤滑鼠的控制不同,音量的控制需要天份,一般人很難達到純熟,也因此聲控遊戲玩起來特別有趣和刺激。
在電腦開發聲控遊戲必須先設置好麥克風,或者是其它能夠收集聲音的裝置,例如:視訊鏡頭。
在製作遊戲之前,請點擊連結試玩遊戲:https://e.meps.tp.edu.tw/scratch/sound%20fly .html
收集聲波資料
在 Scratch 中可以透過「偵測」類積木中的「聲音響度」取得目前的環境音量。如果要在「舞台」上繪製聲波圖,我們必須要收集「聲音響度」儲存到「清單」中,然後再用「畫筆」積木繪製出來。
「清單」也是「變數」的一種,是用來記錄一群資料所使用的結構,所有的資料都被以相同的變數名稱存取,但是大家依照順序排序,所以每一個資料項目都有一個索引值,只要指定要存取的索引值就可以從清單中取出或存入資料項目。
當我們將「聲音響度」儲存進清單時,越早存入的資料其索引值就越小,所以當要刪除過時的資料時,必須從第一筆開始刪除,而第二筆資料就會自動遞補為第一筆。這種先儲存的資料先刪除的做法稱為「先進先出法」(FIFO,First In First Out)。
步驟一:
建立一個空白的角色,命名為「聲波圖」,這個角色只用於繪製聲波圖,所以不需要造型。
建立一個清單,命名為「聲波」。
首先將清單內的所有資料清空,以避免反覆執行時,上ㄧ次的資料會遺留在裡面。
接著使用一個「重複無限次」迴圈開始收集資料,檢查資料項目是否超過 480 筆,如果是則將超過的舊紀錄刪除。
之所以只保留 480 筆資料,是因為「舞台」的寬度是 -240 ~ 240,只有 480 個點。
擴展積木與函式積木
在 Scratch 中有三種程式積木可以使用,分別是:預設積木、擴展積木、函式積木。
預設積木:也就是 Scratch 所提供的基本積木,依照功能分為:動作、外觀、音效、事件、控制、偵測、運算、變數等 8 類,並以不同顏色區分以方便閱讀和尋找。
擴展積木:Scratch 可以透過擴展套件來取得新積木,這些擴展套件是開發者或廠商為了讓 Scratch 可以獲得額外功能、連接外部網路、單晶片或物聯網裝置而設計的,在本單元中所使用的「畫筆」積木就是屬於擴展積木。
函式積木:Scratch 允許設計者可以自行創建函式積木,讓部分程式可以反覆利用,一方面可以讓程式更容易閱讀和理解,另一方面可以提昇程式寫作的效率。本單元我們將嘗試創建函式積木並利用函式積木完成幾何圖形的創作。
「畫筆」積木是 Scratch 的擴展積木,可以從右下角的「添加擴展」。
函式積木的執行方式
建立函式積木時,如果將「執行完畢再更新畫面」打勾,則函式積木中的所有程式都會在背景執行,執行過程將看不到,但可以提高執行效能。
不打勾則積木會在前景執行,可以從舞台觀察到執行的過程,但其他程式必須等待函式積木執行完畢,因此會有畫面延遲(lag)的現象。
通常在程式需執行大量運算時(例如:設計互動遊戲),會讓積木在背景執行。在本單元中,你可以試試看兩種執行方式有何不同,特別是在「畫圓」的時候,請好好體驗前景與背景執行的速度差異。
繪製聲波圖
步驟二:
建立一個變數「掃描線」,用來記錄清單「聲波」目前的索引值。這個變數請設定成「僅適用當前角色」。
建立一個函式積木,命名為「畫聲波」,記得將「執行完畢再更新畫面」勾選起來。
首先將「筆跡全部清除」,將畫筆(即目前的角色)定位到螢幕的左側邊緣,將變數「掃描線」歸零。然後再下筆。
請使用一個「重複 480 次」的迴圈,將掃描線加ㄧ,並從清單「聲波」讀取相對應的資料,也就是從第一筆開始讀,直到第 480 筆。
由於「聲音響度」數值範圍是從 0 ~ 100,沒有負數。所以繪製出來圖形不像聲波圖,可以把「聲音響度」數值乘以 -1 來模擬。
迴圈執行完畢後,使用「停筆」積木停止繪圖功能。
這裡我們繪製的聲波圖,其實不是真正的聲波圖。真正的聲波圖除了聲音響度(聲音震動的幅度)以外,也會收集聲音振動的頻率,而形成複雜的波形。
步驟三:
將剛剛定義好的「畫聲波」積木,插入到主程式中,一邊繪製聲波圖,一邊收集聲音響度,如右圖。
請測試執行結果是否與預期相同。
用音量控制飛行貓
步驟四:
切換到小貓角色的造型分頁,新增 Scratch 內建的「Cat Flying」造型,並將原有的兩個造型刪除。將角色名稱修改為「飛行貓」。
設定飛行貓的迴轉方式、起始位置和角度,然後進入遊戲迴圈。
我們需要一個變數「高度」,用來計算和儲存飛行貓上升或下降的幅度,請勾選「僅適用於當前角色」。
以 20 分貝為基準,當音量大於 20 分貝就增加高度,小於 20 分貝就降低高度。將聲音響度減掉 20 以後,還必須除以 3,讓高度變化不要太劇烈,你可以試試看除以 1 或 2 的效果,這個數字是可以依照個人喜好自由調整的。
將飛行貓的 Y 座標,依照計算出來的高度增減(高度為負數時,就是減少),注意不要讓飛行貓飛出舞台的範圍,也就是說,Y 座標要介於 -160 ~ 160 之間,考慮到舞台上方要顯示目前的生命值和飛行距離,所以略為下降到 125 左右。以上數據僅供參考,你必須根據自己飛行貓的大小和變數顯示的方式來調整這些數字。
為了讓飛行貓表現出往上飛和往下飛的動態,我們也可以修改飛行貓的旋轉角度,朝右平飛是 90 度,而當變數「高度」為正數時,角度必須往上傾斜,也就是角度必須小於 90 度,「高度」為負數時,必須往下傾斜,也就是角度必須大於 90 度,因此是用 90 度減去高度變化。為了讓角度變化看起來比較明顯,會先把「高度」乘以 3,然後再用 90 去減。與前面相同,要不要乘以 3,還是要乘多少,可以自由調整。
請測試執行結果是否滿意,如果不滿意請調整以上數學算式裡的相關數據。
捲軸動畫-背景水平捲動
我們的飛行貓雖然 Y 座標會變化,但 X 座標始終固定在舞台上同一個位置。如果要表現出往前飛行的動畫效果,我們就必須移動背景才行。你可以想像背景圖是一張很長的圖片超過舞台的寬度,而我們只能看到出現在舞台的部分。
由於 Scratch 並不允許造型的寬度超過舞台太多,因此只能使用多個角色,或多個分身來接圖。底下的範例將使用分身來接圖。
步驟五:
首先,繪製舞台背景,只需要單純的天空色和太陽。太陽使用內外漸層,內部為橘黃色,外部為透明。
建立一個新的空白角色,命名為「背景」。切換到造型分頁,先畫出矩形,然後使用「塑形」工具拉出山脈的形狀。這樣的造型需要兩個以上,請注意靠近舞台邊緣的地方,必須調整山脈的高度讓它可以跟下一個造型的山脈銜接在一起。
注意到舞台左下和右下各加一個點,以保證造型移動到舞台邊緣時可以無縫接圖。
Scratch 為了防止角色不小心移出畫面,所以當角色邊緣靠近舞台邊緣時,座標會被凍結。加兩個點讓角色邊緣變大,就可以讓這個機制延後發生作用。
本體與分身
分身是本體的複製版本,跟直接複製角色不一樣的地方有三個:
分身可以跟本體共用造型和音效,而不需要反覆載入相同的造型和音效檔,所以可以節省記憶體使用量。如果直接複製角色,則複製的越多越浪費記憶體。
分身可以跟本體執行不一樣的程式,也就是設計程式時,可以同時寫兩份程式碼,一份給本體執行,一份給所有的分身執行。如果是直接複製角色,則必須針對不同角色編寫不同程式。
分身只在程式執行期間存在,當結束所有程式時,會自動被註銷。複製的角色則會永遠存在,除非手動刪除。
為了在分身與本體之間分配程式碼,請使用「當分身產生時」積木,把程式碼指派給分身執行(本體不會執行這一段程式)。要給本體執行的程式,請使用「當綠旗子被點擊」積木(分身將不會執行這一段程式)。如果使用「當收到訊息...」積木,則無論本體或分身都會執行該程式。
「分身刪除」積木的作用是將自已刪除,所以必須分配給分身執行才會有效果。如果以後還會用到這個分身,可以直接使用「隱藏」積木,而不需要刪除,等到要用到時再「顯示」就可以了。如果確定不會再用到它,則可以在遊戲結束之前直接刪除,以便進一步減少記憶體的使用量。
步驟六:
建立變數「背景圖位置」和「顯示位置」,請設定為「僅適用當前角色」,這樣可以讓每個分身都擁有自己的同名變數。
建立變數「主角位置」和「速度」,都是「適用所有角色」。前者用來設定主角飛行貓目前在整張拼合的背景圖中的位置,後者則是飛行貓的飛行速度,其實也就是背景捲動的速度。
角色「背景」(不是舞台背景)本體是不需要顯示的,因此先隱藏起來。設定第一個分身的造型和位置,然後「建立自己的分身」。如果要往左捲動,那麼下一張圖片應該接在第一張圖片右邊 480 的位置。
反過來說,如果是要向右捲動,那麼下一張圖片位置就是 -480。
捲動背景圖
介紹捲動最簡單的方法,將所有圖片(所有的分身)同時一起向左移動「速度」點,當圖片往左移出舞台外面時( X 座標為 -480),將圖片接回到舞台的右側( X 座標為 480)。
這個方法雖然簡單,但是有底下三個缺點:
由於程式並未計算「主角位置」與「背景圖位置」的距離,因此當主角在舞台上的位置移動時,背景圖不會自動移到相對應的位置。(好險,在本作中我們並不會改變主角的位置)
如果將「速度」設定為負數(往右捲動時),背景圖不會自動接圖,因為沒有判斷背景圖移出舞台右側( X 座標為 480)的情形。
程式並未考慮背景圖片超過兩個舞台寬度的情形。
考慮以上所有情形,將捲動程式改良如下。
步驟七:
計算背景圖與主角的距離,並儲存到變數「顯示位置」中,「顯示位置」就是背景與主角此刻的相對位置。
計算「顯示位置」除以背景圖總寬度的餘數。如果角色「背景」有兩個造型,則總寬度為 480 x 2 = 960。假設「顯示位置」為 1200,因為 1200 已經超出背景圖總寬度 960,而超出部分是 240(餘數為 240)。也就是說主角已經位於循環一次的背景圖中 X 座標為 240 的位置。
如果要讓背景圖向左或向右捲動都能正常執行,那麼一開始就必須在第一個造型的左右兩側各準備一個分身,如果有兩個造型就需要三個分身。
或者我們可以這樣想,一開始主角就是在第二個造型中,這樣主角就可以向左回到第一個造型,或向右走到下一個造型。因此,把整張背景圖往左邊一個舞台寬度擺放就可以了,這就是餘數還要 - 480 的原因。好處是我們不用多準備一個分身。
當主角移動時,無論是往左或往右,都能正確匹配主角與背景圖。
請將右側的程式,加到飛行貓「重複無限次」迴圈中。
為了向左、向右都可以捲動,需要準備三個分身,或者是把整張背景圖向左移動一個畫面。
補充教材
加入前景捲動動畫
如果要讓背景更有立體感,我們可以加入前景,前景捲動速度應該比背景更快,這樣整個舞台空間會更有層次。前景的做法與背景差不多,我們將準備背景兩倍數量的造型,這是因為我們希望前景捲動速度快兩倍,因此造型的消耗速度也就會快兩倍,一開始就準備足夠的造型才能應付需求。
這次要產生四個分身,可以考慮用「重複 4 次」的迴圈來處理。
另外顯示位置是「背景圖位置」減去「主角位置」的兩倍距離。這樣捲動速度就會變成兩倍。
加入敵人
只有飛行貓自己一個人太寂寞了,我們來增加一些敵人。首先,建立兩個「適用所有角色」的全域變數,分別是「生命」和「距離」,用來儲存玩家的剩餘生命和累計飛行距離。記得在飛行貓的程式裡,設定「生命」的起始值,例如:「變數生命設為 5」。
我們將利用「生命 < 1」當作遊戲迴圈的結束條件,請將上面的所有程式中有使用「重複無限次」的迴圈,通通改成「重複直到 生命 < 1」。
在飛行貓的程式中,請在「重複直到 生命 < 1」迴圈中將「距離改變 1」,用來統計目前的飛行距離。
建立新角色「敵人」,找一些適合的造型當作敵人,如下圖。在敵人角色中,建立新的變數「敵人速度」,並設定成「僅適用目前角色」,這樣可以讓所有的敵人分身都擁有「敵人速度」這個變數。
敵人在飛行距離到達 500 以後才會出現,出現的敵人數量為飛行距離 500的倍數,例如:當距離為 1000 以上會同時出現兩個敵人。
敵人向右飛行,碰到邊緣時就刪除,碰到玩家時,將玩家生命減 1,並且刪除分身。
加入輔助道具
有了敵人之後,我們也加入可以補命的輔助道具。
建立新角色「生命」,使用 Scratch 內建的「heart red」愛心造型,如右圖。
愛心出現的間隔時間為 8 秒,這個可以自由修改。
愛心的飛行速度是飛行貓的 3 倍,這個數字也可以自由修改。
單元三:樂透抽籤機
共同討論:
小朋友你們有參加過大賣場舉辦的摸彩活動嗎?大家都是如何提高得獎機會?
如何保證摸彩的公平性呢?
參考答案
1.每人限投一張。
2.規定折疊方式。
3.抽獎前必須攪拌10秒。
4.彩劵應該裝在圓形容器裡抽出。
基本款抽籤機
電腦抽籤比較公平:避免人為操控、抽中機率接近公平(隨機數的特性:抽籤次數越多越公平)
製作抽籤機程式時,為了適應各班人數不同,抽籤範圍應該由使用者自行輸入
此程式共需要三個角色,佈置如右。
步驟一:
新增一個角色到舞台上負責與使用者互動,範例使用機器人角色
機器人提問:全班有幾人?
建立變數「抽中」用來儲存抽籤結果
把使用者輸入的答案作為隨機數的上限
步驟二:
建立動畫角色【十位數】,造型為數字 1~9、0(0 排在第10個),把造型命名為所代表的數字。
將動畫角色【十位數】複製一份作為【個位數】
隨機顯示數字,重複20次
最後一次需顯示成變數「抽中」所代表的數字
十位數:抽中除以10取整數
個位數:抽中除以10的餘數
十位數
個位數
步驟三:
修改【機器人】角色的程式,
當點機器人一下就可以重新抽籤
(跳過提問和回答的程序)
實體運算
如果不使用電腦,也能公平地抽籤嗎?
分組討論:
只有一顆骰子要如何隨機抽出班上任一位同學?
當問題很複雜時,我們可以嘗試簡化問題降低難度,例如:
從 2 個人中抽 1 個,怎麼辦?
如果是從 3 個人中抽出其中 1 個,又有甚麼方法呢?
老師歸納解法,關鍵在於將骰子點數分組以便匹配人數。
參考答案
人數比骰子點數少時,可以將骰子點數分組,例如:1、2、3 一組,4、5、6 一組,抽到第一組就是第一個人,抽到第二組是第二個人。
3 個人時,骰子分三組,例如:1、2 第一組,3、4 第二組,5、6 第三組。
分組討論:
如果是從 12 個人中抽出其中1個,又有甚麼方法呢?
參考答案
人數比骰子點數多時,可以將人員分組,例如:1~6 號一組,7~12 號一組。
骰子丟兩次,第一次若為奇數抽中第一組,若為偶數抽中第二組。第二次抽人,為該組裡第幾個人。
回到原來的問題:
只有一顆骰子要如何隨機抽出班上任一位同學?
由於班上同學人數無法剛好分成六個人一組,所以需要例外處理,如果抽中不存在的人,就必須重抽。
若第一次抽中 4,第二次抽中 3,如何知道實際上抽中的同學是誰呢?
參考答案
如果是 1,1,是第一組第一個人,也就是抽中 1 號
如果是 2,1,是第二組第一個人,也就是抽中 1+6=7 號(因為一組有 6 人)
如果是 3,1,是第三組第一個人,也就是抽中 7+6=13 號
如果是 4,1,是第四組第一個人,也就是抽中 13+6=19 號
所以 4,3,就是抽中 21 號,全班的第 21 位同學。
假設第一次抽中的是 X,第二次抽中的是 Y,如何把剛剛的討論結果轉換成演算式?
參考答案
(X-1) * 6 + Y
如何將序號轉換成座號呢(假設男生從 1 號開始,女生從 21 號開始)?
參考答案
方法ㄧ:
假設男生人數為 14,抽中號碼小於或等於 14 則不需要換算,抽中等於座號;如果抽中是 15,轉換成座號就是 21 號。
抽中之序號若為 X,則座號就是 (X - 14) + 20
如果把男生人數改為 A,女生的座號從 B 開始,則
座號 = (X-A) + (B-1)
如果把變數改成中文,也就是
座號 = (抽中 - 男生人數) + (女生起始座號 - 1)
方法二:
計算中間沒有人的空號 21-1-14 = 6(從 15 號到 20 號有 6 個號碼是空號)
如果抽中為 X 而且「抽中>男生人數」,則座號就是 X + 6
如果把男生人數改為 A,女生的座號從 B 開始,則
座號 = X + (B-1-A)
如果把變數改成中文,也就是
空號 = 女生起始座號 - 1 - 男生人數
座號 = 抽中 + 空號
方法三:
如果想要節省計算的時間,也可以事先製作「序號與座號對照表」,利用「查表法」來求得答案。
跳號抽籤機
任務:將上上一節課完成的基本款抽籤機,該成通用型抽籤機
(本校任何一個班級都能使用,女生座號都是從 21 號開始)
步驟一:
將提問從「全班有幾人?」,改成「全班有幾個男生?」和「全班有幾個女生?」
新增變數「男生」、「女生」、「總人數」
計算全班總人數,並以總人數做為隨機取數的上限
步驟二:
取得隨機數後,先檢查抽中是否大於男生人數
若是,則按照前一節課的討論換算成座號
查表法簡介
假設總人數為 29 人,我們需要 29 個抽屜,依序將全班同學的座號寫在紙上放進抽屜裡
當抽中 22 號時,把第 22 個抽屜打開,看看座號是幾號就可以了
在 Scratch 裡面,剛剛講的抽屜也就是前面介紹過的「清單」。
程式設計步驟:
使用清單時,必須先「初始化」,也就是將所有項目清空
把變數「流水號」設定成男生與女生的起始座號
依序把流水號放入清單「座號表」中
每放入一個座號就必須把「流水號」加 1,讓流水號變成下一個座號
抽籤時上限改為清單的長度,因為清單長度就是所有座號的總數量
將座號表中抽中的項目取出來,儲存到變數「座號」中,注意:「十位數」和「個位數」兩個角色中的變數「抽中」(序號)必須改成變數「座號」。
單元四:海龜畫圖
LOGO 海龜畫圖
Logo是一種電腦程式設計語言,在1966年由西摩爾·派普特和Wally Feurzeig設計,Logo一詞源自希臘語邏各斯(logos)。Logo是一種直譯語言,和其他語言不同的是,它內建一套海龜繪圖(Turtle Graphics)系統,通過向海龜傳送命令,使用者可以直觀地學習程式的執行過程,因此很適於初學者特別是兒童學習程式設計。
海龜繪圖使得Logo使用者可以通過簡單的編程創作出豐富多彩的視覺效果或圖案。假想一隻帶著畫筆的海龜可以接受簡單的命令,例如向前走100步,或者左轉30度。通過對這隻海龜傳送命令,可以讓它繪製出較為複雜的圖形,例如正方形,三角形,圓等。
海龜的移動相對於它本身所在的位置。例如,命令"左90"意味著讓海龜左轉90度,學生可以站在海龜的角度來思考它將如何執行命令,這使得程式設計更加形象化,也更易於理解。
code.org 冰雪奇緣闖關活動
網址:https://studio.code.org/s/frozen
底下三個難關,請依據老師課堂上的提示,嘗試過關:
第六關:巢狀迴圈的應用
第十關:平行四邊形四個外角的計算方法
第十四關:自定義函式(Function)的應用
從畫點到畫線
要在舞臺上畫出線條,必須用到 Scratch 的畫筆積木
使用畫筆積木,應該先做「初始化」,也就是把舞台上所有筆跡清除,並讓畫筆角色回到舞台中央面朝上
練習使用函式積木定義自己的指令積木
使用新定義的積木清除畫布(舞臺)
幾何學裡面最基本的單位是點,畫點可以使用「下筆」積木
連續畫點就會形成線,右圖的「畫線」積木用來畫長度 100 的線
改成自行輸入線的長度,積木會更好用,函式積木可以定義輸入方塊以接受外部輸入的資料,在程式設計裡這些方塊被稱為:引數(或稱為「參數」)
引數與變數功能相同,但作用範圍不同,引數僅在該函式積木內有作用。
輸入方塊有兩種:數字或文字、布林值,我們要使用的是前者,並將該輸入方塊命名為 x,你可以把 x 當成該函式積木的內建變數來使用(用拖曳方式引用)
正多邊形的畫法
我們知道繞一圈回原位就是轉 360 度,三角形可以想成是圓形的變形(把一個圓形的橡皮筋套在三根鐵釘上面),因此畫完每一邊要轉 360÷3=120 度,總共要畫三次。
其餘多邊形也可以想成是圓形的變形,畫 N 邊形每次要轉 360÷N 度
把長度和邊數改成輸入方塊並命名為 y 和 z,設計出多邊形函式積木。
利用剛剛設計好的多邊形積木,我們可以畫出複雜圖形
右邊範例是畫 10 個 5 邊形繞一圈的結果,請小朋友自行修改邊長和邊數化出不同的複雜圖形,也可以修改重複次數,但右轉角度也必須同步修改。
圓的畫法
多邊形積木也可以用來畫圓形,方法是把長度改為 1 或 2,邊數改成 360 邊。
我們習慣用直徑來測量圓形的大小,利用多邊形積木畫圓,必須改用邊長,比較難掌握畫出來的大小。
請嘗試設計一個新的積木來畫圓,輸入的資料是直徑。
把直徑乘以圓周率(3.14)算出周長,然後把周長除以 360 就得到 360 邊形的邊長。這樣我們就可以畫出正確大小的圓。
弧的應用
畫圓畫一半就會得到弧線,我們根據畫圓的積木,設計一個新的畫弧積木。
利用畫弧積木,可以進一步設計出更多複雜圖案。
組合兩個弧變成花瓣,然後利用花瓣積木,畫出不同花瓣數量的花。
作業:請利用隨機數在舞台的任意位置,繪製 3 ~ 12 個花瓣,大小 20 ~ 60 的花朵,記得修改畫筆顏色,以呈現出五彩繽紛的花園氣氛。
補充資料:五芒星畫法
要畫五芒星,那就先研究三芒星畫法,所謂三芒星其實就是正三角形。小朋友已經知道三角形內角和是 180 度,也就是說「三芒星的三個芒角加起來是 180 度」,事實上「五芒星的五個芒角加起來也是 180 度」。
要畫五芒星的話,就是要把 180 度分給 5 個芒角,180÷5=36,每個芒角 36 度。用海龜來畫圖,每次轉彎的角度是外角,外角的算法是 180-內角,以五芒星為例,就是 180-36=144 度。
下面最右邊的積木可以用來畫任意奇數的芒星,但偶數芒星的算法太複雜,這裡略過不討論。
補充資料:螺旋與遞迴
利用課堂上所設計的「畫弧」函式積木,可以進一步畫出螺旋線,方法是一邊畫弧線,然後一邊把直徑縮小,例如:每畫一條 90 度的弧線就把直徑縮小 5 點,一直縮小到直徑為 0 時停止。
這是一個需要反覆執行相同動作的程式,可以利用「重複執行直到」積木來製作,如下圖左邊的函式積木。這個函式積木裡面需要對「引數(參數)」進行運算操作,但可惜 Scratch 的「引數(參數)」不提供運算功能,所以只能改用變數來設計。
換個方式來思考,把螺旋線最外面一條 90 度弧線擦掉,剩下的圖形也是螺旋線,以此類推,我們可以發現螺旋線就是由更小的螺旋線組成的。只要反覆執行「螺旋線積木」就可以把整個螺旋線畫好。這種函式積木「引用自身」的做法稱為「遞迴」演算法。
下面右側示範的是最簡單的遞迴程式,僅只引用自身一次,而這一次不需要用到變數。下列兩個程式的執行結果完全相同,仔細觀察比較很快就會發現「遞迴其實就是重複執行的另一種寫法」。