編程-scratch-算法初體驗-01(窮舉法)

人的算法叫做人算,天的算法叫做天算,按照這種簡稱方式,那麼計算機的算法難道叫做“計算”?感覺瞬間降了幾個檔次呀!不過總算還是比“算計”來得好。以上純屬插科打諢,下面進入正題。

依舊是本着生涯教育的第一步——通識教育爲出發點,除了從計算機語言方面的學習來了解信息技術之外,通過對基礎算法的學習,不僅可以深入瞭解計算機如何“思考”,而且還可以提升自我的邏輯思維能力以及解決問題的能力。另外,算法是獨立於語言之外的,而語言只是實現算法的媒介,所以,當您理解了相關的算法之後,就可以用不同的語言在計算機上實現,比如c、c++、java、python、scratch等等,甚至在現實世界中,有意識地將算法加入到自己的方法體系中,以應付這個萬千世界。

本系列課程面向對象爲小學三年級以上學生,爲使在學習算法的過程中,更便於不同業界大佬在計算機上實操,課程將藉助scratch來實現算法。(不懂scratch的同學可以百度搜索一下,只要你懂得搭建積木,那麼入門還是非常容易的,這裏不贅述。考慮部分同學可能第一次接觸scratch,所以本課針對算法的實現過程錄製了微課視頻)因爲課程主要介紹基礎算法部分內容,相信大部分同學也是第一次接觸算法,顧,本課程題爲——《算法初體驗》。

壹·地毯式搜索

 

一天,小A的爺爺來學校接小A回家,因爲重新分了班,小A的爺爺只記得小A的教室在5樓,但不記得具體是哪個教室哪個班級了。所以他上到5樓之後,就從第一個教室開始找,沒有,就到第二個教室找,再沒有,就到第三個教室找,就這樣一個教室一個教室找直到找到小A爲止。找到小A了後,如果5樓的教室還有很多,那小A的爺爺還需要繼續去剩下的教室找嗎?

在這種情形下,當然是不用了。

剛纔小A爺爺找小A其實就是要解決一個搜索問題,我們來分析一下,解決搜索問題一般有哪些步驟。

第一步,確定要找的東西,也就是要找的目標,在開頭的故事中就是“小A”;

第二步,確定你要搜哪裏,也就是搜索的範圍,在開頭的故事中就是5樓的教室;

第三步,確定你如何展開搜索,也就是搜索的方法,在開頭的故事中小A的爺爺用的是什麼方法呢?對了,就是窮舉法

其實,日常生活中我們經常會用到窮舉法來找東西,特別是在凌亂無序的房間裏找東西;在解決數學問題的過程中,我們也會用窮舉法來幫助我們找到符合問題所要的答案,比如中國古代的百雞問題等等;在計算機的世界裏,窮舉法則是求解問題最常用的方法之一。

 

 

貳·千篇不如一例

說一千道一萬,不如來一個實例,我們一起來看下面一道練習:新建一個列表,隨機生成12個數字插入到列表中。用戶輸入一個數字,利用窮舉法判斷這個數字在不在這個列表裏,如果在,則返回這個數字在列表中首次出現的序號,否則,返回“不存在”。

比如:下面的列表,輸入“10”,返回“您查找的數字在第8項”。輸入“50”,返回“您查找的數字不存在”。輸入“19”,返回什麼呢?這裏我們只需要知道這個數字在不在列表中,而且題目要求只需要返回列表中首次出現的序號,所以我們只需要返回“您查找的數字在第4項”就可以了。

接下來,我們用scratch來實現一下,具體看如下步驟:(同學也可以直接觀看步驟後緊接着的微課視頻)

1、這裏用“空格”來作爲觸發一個開始的事件

2、新建一個列表:命名很重要,我們把這個列表命名爲“RandomList”--隨機列表。

3、爲了多次使用,首先要“初始化”列表,清空列表:每一個軟件都會有一個最初的狀態,這個最初的狀態在計算機的世界裏通常通過“初始化”來實現。

4、利用隨機數,運用循環結構,將隨機生成12個數字插入到列表中。

5、現在要開始詢問用戶需要查找什麼數字了,我們用到“詢問”積木塊,詢問句子可以爲“請輸入您要查找的數字。”

6、scratch執行到這裏會自動等待用戶輸入結果,結果會存在“回答”裏。

7、接收到用戶的“回答”後,我們要開始用用戶“輸入”的回答進行判斷。

8、判斷的對象就是列表中的每一個數,我們利用窮舉法,一個一個來進行比較判斷,當我們找到用戶要的結果時,按照題目要求,我們不需要再尋找下去了,直接跳出循環。這邊我們用“重複執行直到”來進行判斷,結束循環的條件有兩個:一個是找到了;另一個是找遍了沒找到。

9、爲了能夠標識我們現在比較的是列表中的第幾項,我們需要新增一個變量來標記當前比較的是列表中的第幾項,變量的名字也是非常重要的,一般根據變量的作用和功能來取名。這邊的變量主要是用來記住現在我們在判斷列表中的第幾項。類似這樣的變量我們通常叫做“下標”,這裏我們用“Index”來命名它。

10、一開始,我們需要把Index的值標記爲項目中的第一項,然後在循環的判斷條件中,找到了意味着“列表中的第Index項”等於“回答”,找遍了沒找到意味着“Index”大於“列表中的項目數”。

11、循環體結束後,我們做以下工作,利用選擇結構來輸出反饋的結果。

12、按照題目要求,如果“Index”大於“列表中的項目數”,那麼我們回答“你查找的數字不存在”,否則,我們回答“您查找的數字在第Index項”。這裏我們用到了字符串的連接。

13、好了,接下來,我們按下“空格鍵”可以測試啦。

14、如果沒問題,我們把完成的窮舉法練習代碼保存起來,保存的文件名命名也很重要,這裏我們可以取名爲:“算法初體驗_窮舉法”。

不熟悉scratch的同學可以通過關注微信公衆號,到以下鏈接的微課視頻進一步瞭解實現過程:

https://mp.weixin.qq.com/s/b0H_6g3i9p9IOMf98zlwGg

具體代碼參考如下:

叄·歸納小結實戰鞏固

實現了人生中第一個算法,非常有成就感有木有。那麼接下來我們擴展下,現在小A作爲學生幹部,要檢查5樓的教室的衛生情況,看哪些是沒打掃乾淨的,這裏搜索目標是“沒打掃乾淨的教室”搜索範圍是“5樓的教室”搜索方法這裏當然也需用到窮舉法,即“一個教室一個教室去檢查”,但是跟我們開頭的故事有點不同的是,這裏如果檢查到了有一間教室衛生狀況不好,那小A就停止下來不繼續檢查剩下的教室了嗎?當然不是,在這裏,小A需要把所有的教室都檢查一遍,然後把衛生狀況不好的教室統一列出來。

在這裏體現了窮舉法的基本思想:列舉出所有可能的情況,逐個判斷有哪些是符合問題所要求的條件,從而得到問題的全部解答

總之,窮舉法是可以解決搜索問題的一種方法,解決搜索問題,我們有三個步驟,分別是確定目標,確定範圍,最後,根據目標和範圍來確定搜索的方法。

同學們可以通過以下的課後習題鞏固一下今天所學的新知,新建一個列表,隨機生成20個數字插入到列表中。用戶輸入一個數字,利用窮舉法判斷這個數字在不在這個列表裏,如果在,則返回這個數字在列表中的所有序號,否則,返回“不存在”。

比如:下面的列表,輸入“10”,返回“第8項”。輸入“50”,返回“不存在”。輸入“19”,返回“4,5”,這裏我們看到第4項和第5項都是數字19,所以返回值應該是這兩個序號。

 

肆·走出舒適區

村上說:“痛楚不可避免,磨難卻可以選擇”,疫情當前,很多同學在玩遊戲,滿足於及時反饋帶來的低級成就感,而更多的同學在不斷地夯實自己的基礎知識、基本技能,甚至乎用自己所學的知識來做遊戲、制定遊戲規則。希望自覺的學生習得更多的技能和知識,也期盼不自覺的學子早日醒悟。

scratch的教學多數是以製作遊戲或者動畫爲主,本系列課程也想借此來跟大家分享其實scratch還可以做更多有趣的事情。當然了,課程根本目的是爲了與大家一起來學習基礎的算法,“技多不壓身”,期盼大家走出舒適區,就如同肌肉成長一樣,不破不立。

 

識別二維碼關注“梅外成長記”公衆號,跟您一起成長,一起終身學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章