分享好文,中學生要學電腦嗎?
作者:創新工場CTO、人工智慧工程院執行院長 王詠剛
文章来自半轻人微信公众号(ban-qing-ren)
………………………………
朋友的孩子高中剛畢業,已拿到美國頂尖大學(非電腦專業)的錄取通知。疫情影響,不知何時才能去學校報到。孩子想抓緊學習一下程式設計,為大學打好基礎。這孩子找我聊了一個多小時,從如何學程式設計,聊到非電腦專業和電腦專業的路徑差異,又聊到如何從不同角度認識電腦與程式設計。聊得比較寬泛,不知是否對這孩子有用。
回想我自己的高中時代:那時雖迷戀程式設計,卻完全沒有懂行的人指導。在我們那個四線城市的廠礦中學裡,開設電腦興趣課的老師知道的資訊還沒我多。我高一時跑到北京中關村逛街,卻完全沒意識到中國第一代頂尖程式師當時就在我身邊的低矮辦公樓裡寫代碼(這話說得並不準確,比如求伯君那年就主要是在珠海做開發),鼎鼎大名的UCDOS、WPS、CCED就出自他們之手……我在當時街邊的一家書店(位置似乎就在今天的鼎好大廈對面)買到了許多種印刷品質極低劣的電腦圖書。用今天的標準看,那就是一批盜版影印或未授權翻譯的國外圖書。可那批書竟成了我高中時代最寶貴的程式設計知識來源。
顯然,我在高中時根本就是野路子學電腦。現在後悔也沒用,當時我的眼界或能觸及的資源就那麼多。如果能穿越回30年前,我該對喜歡程式設計的自己說些什麼呢?這些年,我與世界上最好的一批程式師合作過,也參與過世界上最有價值的軟體系統研發——我所積累的一些粗淺經驗裡,有哪些可以分享給一個愛程式設計的中學生?
【問題1】中學生要不要學電腦?
當然要!
每個中學生都要學。只不過——建議大部分中學生使用“休閒模式”,小部分(不超過10%)中學生使用“探險模式”。
啊?兩個模式?那我該進入哪個模式?⟹請跳轉至【問題2】
【問題2】選哪個模式?
你癡迷電腦嗎?比如,你玩遊戲時會特別想知道這遊戲背後的代碼是如何編寫的嗎?再比如,就算老師家長不同意你學電腦,甚至當著你的面把電腦砸了,你也要堅持學電腦嗎?如果是,恭喜你進入“探險模式”⟹請跳轉至【問題200】
你對數學有興趣嗎?比如,你看到街邊建築的曲線,就會在腦子裡琢磨曲線對應的函數或方程嗎?每當手裡攥著幾粒骰子,你就會不由自主地計算概率嗎?如果是,歡迎進入“探險模式”⟹請跳轉至【問題200】;當然,如果有些猶豫,也可以先進入“休閒模式”⟹請跳轉至【問題100】
即便你對電腦和數學興趣不大,家長、老師還是強烈建議你學電腦嗎?就算你一百個沒時間一千個不願意,家長、老師還是會逼著你學電腦嗎?如果是,建議你主動進入“休閒模式”並向家長、老師彙報說“我已經按照前谷歌資深軟體工程師的專業建議在認真學程式設計了”⟹請跳轉至【問題100】
其他情況,一律進入“休閒模式”。⟹請跳轉至【問題100】
【問題100】休閒模式 | 主要學什麼?
“休閒模式”將電腦視為我們生活、工作中的必備工具,主要學習如何聰明、高效、優雅地使用計算設備。這裡說的計算設備,包括所有形式的電腦、手機、遊戲機、智慧家電以及未來一定會進入生活的自動駕駛汽車。
什麼什麼?你已經會用電腦、會玩手機、會打遊戲了?別著急,慢慢往下看。
【問題101】休閒模式 | 我會用搜尋引擎嗎?
我知道你會用百度搜習題答案。但,習題答案不是知識。你會用搜尋引擎來搜索和梳理知識嗎?請試著用電腦和你喜歡的搜尋引擎來解決如下兩個問題:
(1)圓周率𝜋的計算方法有多少種?每種不同的計算方法分別是由什麼人在什麼時代提出的?借助電腦,今天人們可以將圓周率𝜋計算到小數點後多少位?將圓周率𝜋計算到小數點這麼多位元,一次大概需要花掉多少度電?
(2)全球大約有多少個廁所?在發展程度不同的國家,分別有多少比例的人可以享用安裝了抽水馬桶的衛生廁所?為什麼比爾·蓋茨曾大力推動一個設計新型馬桶的研發專案?比爾·蓋茨的公益組織在這個專案上大約花費了多少資金,最終收到了多大的效果?
如果你沒法快速得到上述問題的全部答案,那就給自己設一個小目標:一個月內,學會用搜尋引擎系統地獲取、梳理一組知識點的全部技巧。
【問題102】休閒模式 | 接下來學什麼?
建議學好典型的工具軟體。比如,我知道你會用Office了,但用Office和用Office是很不一樣的。對生活、學習、工作來說,學好、學透一個工具軟體比鑽研程式設計技巧更實用。
你會用Excel來管理班級公益基金的預算和實際收支情況嗎?
你會用Excel做出過去20年裡全球大學排名的演變趨勢圖嗎?
你會用Word排版一篇中學生論文嗎?論文中的圖表和最後的參考文獻部分該如何排版?
你會用Word編排一份班級刊物,包含封面、扉頁、目錄、插圖頁、附錄、封底等部分,可以在列印後直接裝訂成冊嗎?
PowerPoint呢?你有沒有研究過蘋果公司發佈會上那些幻燈片的設計?當約伯斯(多年以前)或蒂姆·庫克站在幻燈片前的時候,他們的演講思路是如何與幻燈片完美結合的?
還有哦,別忘了學學如何為數碼照片做後期,如何用電腦或手機剪視頻,如何為剪輯好的視頻配字幕,如何將照片、音樂、視頻等素材結合起來,做出一段吸引人的快手/抖音短視頻。
最後,抽空玩玩那些設計精妙的遊戲吧,比如《紀念碑穀》、《塞爾達傳說:曠野之息》之類;同時,遠離那些滿屏廣告,或者一心騙你在遊戲裡充值花錢的垃圾。
【問題103】休閒模式 | 不學學知識嗎?
當然要學知識。下面每種實用的電腦知識都夠大家學一陣子了。
(1)色彩知識:你知道同一張數碼照片在不同品牌的手機螢幕上、不同的電腦螢幕上、不同的智慧電視上顯示時,為什麼經常有較大色差嗎?你知道有一些色彩只適合螢幕顯示,不適合列印輸出嗎?你知道軟體工具裡常用的RGB、HSL之類的色彩空間都是什麼意思嗎?如何在設計PowerPoint幻燈片時選擇一組和諧美觀的色彩?
(2)字體知識:你知道什麼是襯線字體,什麼是無襯線字體嗎?你知道網頁中常用的英文字體都有哪些嗎?你知道商務演講時最適用于幻燈片的英文字體有哪些嗎?你知道電腦和手機常用的黑體、宋體、仿宋體、楷體等中文字體分別適合哪些實際應用場合嗎?你會將不同字體混排成一個美觀的頁面嗎?
(3)網路知識:你知道5G是什麼嗎?你知道5G和4G在通信頻寬、通信距離上的具體區別嗎?你知道什麼是路由器,什麼是防火牆嗎?你知道如何配置路由器,如何配置防火牆嗎?微信或QQ聊天時,對方發的文字、語音或視頻是如何傳送到你的手機上的?
(4)應用知識:淘寶中搜索得到的商品資訊是從哪裡來的?商品是按什麼方式排序的?為什麼購物APP經常會推薦給你一些曾經買過、看過的商品?你知道如何為自己建立個人網站嗎?你知道如何管理微信公眾號嗎?
(5)安全知識:你知道網路上的釣魚攻擊是怎麼回事兒嗎?你知道什麼是電腦漏洞嗎?你知道駭客為什麼想把一大批受攻擊的電腦變成可以遠端操控的傀儡機嗎?你知道為什麼現在很多手機APP都要通過短信發送驗證碼嗎?如果驗證碼被壞人截獲,你會面臨哪些風險?
這裡只是舉例。實用的電腦知識還有很多。大家可以自己發掘。
【問題104】休閒模式 | 我需要學程式設計嗎?
可以學,但不是必須。即便學,也只需要根據自己的需要,學那些最能幫你解決現實問題的部分。
【問題105】休閒模式 | 我該學什麼程式設計語言?
在“休閒模式”裡,電腦就是工具,程式設計也是工具,夠用就好。學什麼程式設計語言,完全看你想要電腦幫你做什麼。
• 如果你想對資料處理有更多自主權,那不妨學學Python;
• 如果你想做簡單的交互演示程式,那就先把JavaScript學起來;
• 如果你想更好、更快地寫論文,那不妨學學LaTeX(什麼什麼,LaTeX不是程式設計語言?你太小看LaTeX了);
• 如果你想學做簡單的手機APP,那麼,Android手機就學Java,蘋果手機就學Swift好了;
• 如果你只想知道程式設計是怎麼回事,那……從Python或JavaScript開始就行。其實,跟五六歲的小朋友一起學學Scratch圖形程式設計也不錯。
【問題106】休閒模式 | 我需要學人工智慧嗎?
在“休閒模式”裡,最需要學的不是“人工智慧的實現原理”,而是“什麼是人工智慧”,以及“人工智慧能做什麼,不能做什麼”。
• 在手機上試一試,人工智慧做語音辨識時能做到什麼水準?哪些話容易識別,哪些話不容易識別?
• 打開機器翻譯軟體,試一試哪些資訊翻譯得好,哪些資訊翻譯得不好?
• 手機上的拍照軟體一般都有人臉識別功能。試一試人臉識別在什麼場景下做得好,什麼場景下做得不好?
• 找一部講人工智慧的科幻電影,用自己的判斷解讀一下,電影裡哪些技術有可能成為現實,哪些技術存在邏輯矛盾。
【問題107】休閒模式 | 推薦什麼參考書、參考文獻?
書不重要,豆瓣評分7分以上的電腦應用、程式設計甚至科普類圖書都可以拿來翻翻。
直接在知乎裡搜索你想瞭解或學習的知識點可能更有效率。
如果你意猶未盡,覺得自己剛活動開筋骨,還想挑戰更高層次,歡迎進入“探險模式”。⟹請跳轉至【問題200】
否則,“休閒模式”到此結束。⟹請離開此問答
【問題200】探險模式 | 主要學什麼?
“探險模式”需要有挑戰精神。電腦科學的世界技術演進快,脈絡複雜,要想在探索時不迷路,你得通過有順序、有系統地學習電腦知識,慢慢構建出一張可以在未來幫你走得更遠的思維地圖來。
在“探險模式”裡,電腦就不止是一件能快速計算的工具了。電腦更像是我們大腦的一種延伸。這既包括認知能力的延伸,也包括認知邏輯的延伸。隨著學習深入,大家會逐漸體會到電腦所具有的多維度能力:
電腦是一種可以表示不同類型資訊(數、符號、文字、語音、圖像、視頻、虛擬空間、抽象邏輯)的“資訊管理機”;
同時,電腦也是一種可以連續執行指令以完成特定的資訊處理任務的“指令處理機”;
同時,電腦還是一種可以在知識與邏輯層面完成特定推理任務的“知識推理機”;
同時,電腦也是一種可以從人類給定的資料或自我生成的資料中總結規律,建立模型,自主完成某些決策的“智慧學習機”。
“探險模式”的目標就是盡可能準確地認識電腦,掌握有關電腦運行的最基本規律。有了這些基礎。未來在大學期間或工作中,你就能更容易地設計電腦軟硬體系統,或是設計出碳基大腦(人類)與矽基大腦(機器智慧)之間的最佳協作方案。
【問題201】探險模式 | 我的英語水準足夠嗎?
蘋果每年秋季的新品發佈會,不加字幕的話,你能聽懂多少?
能聽懂大部分:建議在學習電腦的過程中,盡可能使用英文教材、英文文檔。
能聽懂小部分:建議將原來準備學電腦的時間,分出一部分來學英語。
只能聽懂“你好”“再見”之類:⟹請離開此問答。然後,把原來準備學電腦的時間用於學英語,六個月後再回來。
【問題202】探險模式 | 我的數學水準足夠嗎?
如果你是數學和數學應用小能手——較複雜的數學問題總能快速找到核心思路,或快速簡化為簡單問題;很容易就能將抽象概念映射到具體的數學圖形,或將數學問題與相應的現實問題關聯在一起:請繼續探險之旅。
如果你應付正常數學課程感到吃力:建議將原來準備學電腦的時間,分出一部分來學數學。
如果你還搞不清楚什麼是方程、函數、集合、概率……:⟹請離開此問答。然後,把原來準備學電腦的時間用於學數學,六個月後再回來。
【問題203】探險模式 | 為什麼強調英語和數學?
(1)統計上說,最好的電腦參考資料大都是英文寫的,最好的電腦課程大都是用英文講的,最新的電腦論文大都是用英文發表的。
(2)函數、方程、坐標系、標量、向量、排列組合、概率這些中學數學裡會初步學習到的數學知識,是電腦科學的基礎。
【問題204】探險模式 | 電腦知識那麼多,正確的學習順序是什麼?
最重要的順序有兩個。建議先從順序一開始,學有餘力時兼顧兩個順序。
順序一:自底向上,即,自底層原理向上層應用拓展的順序。
電腦原理的基礎知識:
為什麼每台電腦(包括手機)都有CPU、記憶體和外部設備?
(馮·諾依曼體系結構的)記憶體中為什麼既可以存儲資料,也可以存儲指令?
CPU是如何完成一次加法運算的?
程式設計語言的基礎知識:
資料類型,值,變數,作用域……
語句,流程控制語句……
過程、方法或函數,類,模組,程式,服務……
編譯系統的基本概念:
電腦程式是如何被解釋或編譯成目標代碼的?
演算法和資料結構的基礎知識:
陣列,向量,鏈表,堆,棧,二叉樹,樹和圖……
遞迴演算法,排序演算法,二叉樹搜索演算法,圖搜索演算法……
應用層的基礎知識:
為什麼電腦需要作業系統?設備驅動程式是做什麼的?
網路通信的基本原理是什麼?流覽器是怎麼找到並顯示一個網頁的?
資料庫是做什麼用的?
虛擬機器是怎麼回事?
人工智慧系統的基礎知識:
先熟悉些線性代數、概率和數學優化的基礎知識。
什麼是機器學習?從簡單的線性回歸中體會機器學習的基本概念、基本思路。
什麼是神經網路?什麼是深度神經網路?為什麼神經網路可以完成機器學習任務?
如何使用PyTorch或TensorFlow實現簡單的深度學習功能?
順序二:自頂向下,即,自頂層抽象邏輯向下層具體邏輯拓展的順序。
• 電腦的本質是什麼?
• 什麼是圖靈機?什麼是通用圖靈機?
• 什麼是讀取﹣求值﹣輸出迴圈(Read–eval–print Loop,REPL)?
如何用自頂向下的方式理解(解析、解釋、編譯)一段程式碼?
• 靜態語言和動態語言的區別?
如何理解變數與資料類型之間的綁定關係?
• 什麼是函數式程式設計?
程式設計語言中,函數的本質是什麼?
函數為什麼可以像一個值一樣被表示、存儲、傳遞和處理?
• 什麼是物件導向?
類的本質是什麼?
如何用物件導向的方式定義個功能介面?
如何依據介面實現具體功能?
• 什麼是事件驅動?
什麼是事件?事件如何分發到接收者?
如何在事件驅動的環境中理解代碼的狀態和執行順序?
【問題205】探險模式 | 如何提高程式設計水準?
在掌握基本知識體系的基礎上,學好程式設計只有一條路:多程式設計,多參加程式設計比賽,多做程式設計題,多做實驗項目,多找實習機會——其中,能參與真實專案是最有價值的。
【問題206】探險模式 | 該從哪一門程式設計語言學起?
我個人推薦的程式設計入門語言(可根據情況任選):
Python
Java
Swift
C#
JavaScript / TypeScript
Ruby
……
可能不適合入門,但適合後續深入學習的語言:
C
C++
Go
Objective-C
組合語言
機器語言(CPU指令集)
Shell Script
Lua
Haskell
OCaml
R
Julia
Erlang
MATLAB
……
【問題207】探險模式 | 如何選參考書和參考資料?
(1)強烈推薦的參考書和參考資料:
• MIT、Stanford、CMU、UC Berkeley這四所大學中任何一個電腦專業方向使用的教學參考書或參考資料。網上可以查到這些學校電腦專業方向的課程體系,有的學校甚至公開了課程視頻。其中往往會列舉參考書和參考資料連結。
• 維琪百科(英文)上的數學、電腦科學相關條目。
• Github上star數在1000以上的開原始程式碼和開來源文件。
(2)強烈推薦但須小心辨別的參考資料:
知乎上的數學、電腦科學相關條目。使用時需要格外注意三件事:
儘量只看高贊答案或高贊文章;
辨別並避開廣告軟文;
辨別並避開純抖機靈的故事或段子。
Stack Overflow上的程式設計問題解答:
自己動手實驗,辨別解答是否有效。
CSDN上的程式設計問題解答:
自己動手實驗,辨別解答是否有效。
(3)其他推薦的參考書和參考資料:
國內專業作者寫作的專業技術書籍(豆瓣評分7分以上的)。
大廠(Google、Facebook、Microsoft、Amazon、阿裡、騰訊、百度、頭條等)資深工程師的技術公號、專欄、博客等。
著名圖書系列:如O’Reilly的動物封面的系列圖書(請注意最新版本和時效性)。
國內翻譯的著名技術圖書(譯本在豆瓣評分7分以上的)。
(4)儘量避免的參考書和參考資料:
• 已經過時的圖書或參考資料。
• 作者或譯者人數比章節數還多的專業圖書。
• 百度百科上的數學或電腦科學相關資料。
什麼什麼?你這篇問答居然沒有推薦一本具體的圖書?是,沒錯。如果你覺得即便有了上面的線索,自己還是找不到好書好資料,那也許你還是適合“休閒模式”⟹請跳轉至【問題100】
同時也有3部Youtube影片,追蹤數超過3萬的網紅李祥數學,堪稱一絕,也在其Youtube影片中提到,成為這個頻道的會員並獲得獎勵:https://www.youtube.com/channel/UCU2axN3MDyvq01LOK1umZGQ/join 追蹤我的ig:https://www.instagram.com/garylee0617/ 加入我的粉絲專頁:https://www.face...
c遞迴 在 紀老師程式教學網 Facebook 八卦
Make 官方手冊...兼紀老師閒聊 Make 的優點
撰寫 Linux 程式多的人,應該或多或少都會接觸 Make 這套「流程自動化」軟體。它可以把一大堆像咒語一樣的 Linux 指令,給一個乾淨好記的名字,然後你就把那些又臭又長的指令忘了,直接執行那個好記的名字、放鬆喝杯茶,等著工作完成。
不過 Make 也有被人詬病的地方,就是它的自動化語法實在不太親民。由於它發明於 1977 年,當時用 Linux 的人,大多是些電腦專業學者,也不會在乎語法難不難(抑或說,越難越能激起這群人喜歡挑戰的劣根性? XD)。不過一旦學會,它強大的功能實在讓人愛不釋手。我舉幾個我認為不錯的功能給大家:
(1) 目標相依(Target Dependency):你可以要求乾淨好記名字背後那沱指令,執行前必須先執行另一沱定義於其它乾淨好記名字之下的指令。也就是說,你的 Make 會越寫越輕鬆,因為之前辛苦寫好的指令有機會被「重用(音『崇用』)」(咦?「重用」不就是「物件導向」的目的嗎? XD)。如下所示:
my_command: other_command
(一堆像咒語一樣的 Linux 指令)
這會讓 my_command 所屬的那堆 Linux 指令執行前,先執行另一個名字 other_command 下所屬的那一沱 Linux 指令。
(2) 隱式規則(Implicit Rules):你要求 Make 拿 abc.o (類似 Windows 內的 abc.obj)檔加入最終執行檔,但 abc.o 根本不存在。Make 會聰明到知道 abc.o 事實上是由 abc.c (C 語言原始碼檔)編譯過來的。在人類不必介入的情況下,它會聰明地自動編譯 .c 檔成 .o 檔,然後再執行所要求的指令。這會讓 Make 語法大大縮減。因為善用「潛規則」,可少寫很多行 Linux 指令。
(3) 遞迴建造(Recursive Build):當你要求編譯如一串葡萄般複雜的子文件夾結構時,Make 若發現子文件夾內已經有 Make 指令檔了,它會全權委託該 Make 指令檔編譯當地文件夾的內容。這可以讓你撰寫「根 Make File 文件」時,適當分權各文件夾的 Make File 決定如何編譯當地文件。
(4) 與「環境變數」結合:Make 檔裡用的「變數」,根本就是 Linux 下的環境變數。也就是說,如果有個 Make 變數值是:
MY_VAR = abc
我臨時想把它改成 pqr,不必修改原始碼。只要在 Linux 命令列下執行修改「環境變數」的指令即可:
export MY_VAR = pqr
美妙的是,export MY_VAR = pqr 僅存於當下記憶體。下次重開機時,MY_VAR 又會變回 abc。很適合「臨時想改成一個值,但懶得下次改回來」的場合用。
不知不覺,這篇又變成「落落長」(台語,「冗長」之意)了。我寫這麼多,無非是希望我「嵌入式 Linux 程式設計班」的同學,除了詛咒 Make 語法怪異之餘,也能欣賞它的強大之處。「手排車」是比較難開,但要學「藤原拓海」做出過髮夾彎的「水溝蓋跑法」,麻煩您不要詛咒換檔時還要踩「庫拉幾(台語,「離合器」之意)」。
以下附上 Make 官方文件,我班上的同學,想下載 PDF 檔回去好好保存的...咳咳咳...我放在「秘密基地」裡的「eBook」資料夾...麻煩低調地搬回家觀賞... XD
http://www.gnu.org/software/make/manual/make.html
這裡有另一位國外網友,訴說他為何喜歡 Make 的原因。我大多贊同他的觀點,提供給各位參考:
http://bost.ocks.org/mike/make/
c遞迴 在 軟體開發學習資訊分享 Facebook 八卦
本課程是為那些對電腦科學感興趣,並希望從頭開始使用 C++ 實現演算法和指定的資料結構的人所設計
從這 7.5 小時的課程,你會學到
1. 什麼是遞迴
2. 什麼是回溯(backtracking)和動態程式設計
3. 基本的資料結構是什麼: 陣列、連結串列、堆疊、佇列和二元搜尋樹
https://softnshare.com/algorithms-bootcamp-in-c/
c遞迴 在 李祥數學,堪稱一絕 Youtube 的評價
成為這個頻道的會員並獲得獎勵:https://www.youtube.com/channel/UCU2axN3MDyvq01LOK1umZGQ/join
追蹤我的ig:https://www.instagram.com/garylee0617/
加入我的粉絲專頁:https://www.facebook.com/pg/garylee0617/
有問題來這裡發問:https://www.facebook.com/groups/577900652853942/
喜歡這支影片,記得按個"喜歡",並且分享
訂閱就可以看到最新的影片
你最棒,記得按鈴鐺^^
高中數學重要觀念解析:https://www.youtube.com/playlist?list=PLOAKxvSm6LGkzAh5k3h-CI0-clwS7xsWm
數學思考題型:https://www.youtube.com/playlist?list=PLOAKxvSm6LGmx__4F2KucNWpEvr1rawkw
關於數學的兩三事:https://www.youtube.com/playlist?list=PLOAKxvSm6LGlD5ABfGtLkOhNIRfWxIRc5
真的祥知道:https://www.youtube.com/playlist?list=PLOAKxvSm6LGmQC77bAQPdl_Bw5VK8KQc-
YouTube合作影片:https://www.youtube.com/playlist?list=PLOAKxvSm6LGlQk7b-jDmCaUjJ57UMSXsf
高中數學講座:https://www.youtube.com/playlist?list=PLOAKxvSm6LGmgafYQliX1Ewh2Ajun9NNn
學測考前猜題:https://www.youtube.com/playlist?list=PLOAKxvSm6LGko-fghK4k3eZJ23pmWqN_k
指考數甲數乙總複習https://www.youtube.com/playlist?list=PLOAKxvSm6LGlrdoVFRflK46Cm25CGvLBr
統測考前猜題:https://www.youtube.com/playlist?list=PLOAKxvSm6LGkP_Nvl8iToZUWNfOHT42Pg
抖音精選:https://www.youtube.com/playlist?list=PLOAKxvSm6LGmoWuzdrsxoeKQBR_GgZyIk
國中會考總複習:https://www.youtube.com/playlist?list=PLOAKxvSm6LGlbMqjF4W6ElHM_lrFZijkg
![post-title](https://i.ytimg.com/vi/q0xmMj6Wr0A/hqdefault.jpg)
c遞迴 在 寶妮老師 Bonnie Youtube 的評價
傳說河內的某間廟裡
有三根柱子
上面有64 個圓盤
寺廟裡有個古老的預言
當這些盤子全部按照順序被從A移動到C
世界就會滅亡
不過大家還能在這裡一起研究遞迴數列
看來盤子是還沒被移動完ww
快來和Bonnie一起
一邊玩遊戲一邊變聰明吧!!
........................................
Hello!我是Bonnie,大家最害怕的高中數學老師。
因為有感於現今網路多媒體遠比課本紙筆更有吸引力,所以決定除了在學校之外,也在網路上分享我的生活、教學、自修以及與學生相處的小心得。
如果你還是學生,你可以發現老師其實沒那麼討人厭😂如果你已經畢業,你可以在這裡找回一點青春回憶👩🎓👨🎓
Enjoy it and have a good time!
.........................................
IG: charmingteacherbonnie (Bonnie老師)
粉絲專頁: 寶妮老師
https://www.facebook.com/%E5%AF%B6%E5%A6%AE%E8%80%81%E5%B8%AB-Charming-Teacher-Bonnie-290462364959770/
![post-title](https://i.ytimg.com/vi/gqTkx87r3do/hqdefault.jpg)
c遞迴 在 李祥數學,堪稱一絕 Youtube 的評價
成為這個頻道的會員並獲得獎勵:https://www.youtube.com/channel/UCU2axN3MDyvq01LOK1umZGQ/join
追蹤我的ig:https://www.instagram.com/garylee0617/
加入我的粉絲專頁:https://www.facebook.com/pg/garylee0617/
有問題來這裡發問:https://www.facebook.com/groups/577900652853942/
喜歡這支影片,記得按個"喜歡",並且分享
訂閱就可以看到最新的影片
你最棒,記得按鈴鐺^^
高中數學重要觀念解析:https://www.youtube.com/playlist?list=PLOAKxvSm6LGkzAh5k3h-CI0-clwS7xsWm
數學思考題型:https://www.youtube.com/playlist?list=PLOAKxvSm6LGmx__4F2KucNWpEvr1rawkw
關於數學的兩三事:https://www.youtube.com/playlist?list=PLOAKxvSm6LGlD5ABfGtLkOhNIRfWxIRc5
真的祥知道:https://www.youtube.com/playlist?list=PLOAKxvSm6LGmQC77bAQPdl_Bw5VK8KQc-
YouTube合作影片:https://www.youtube.com/playlist?list=PLOAKxvSm6LGlQk7b-jDmCaUjJ57UMSXsf
高中數學講座:https://www.youtube.com/playlist?list=PLOAKxvSm6LGmgafYQliX1Ewh2Ajun9NNn
學測考前猜題:https://www.youtube.com/playlist?list=PLOAKxvSm6LGko-fghK4k3eZJ23pmWqN_k
指考數甲數乙總複習https://www.youtube.com/playlist?list=PLOAKxvSm6LGlrdoVFRflK46Cm25CGvLBr
統測考前猜題:https://www.youtube.com/playlist?list=PLOAKxvSm6LGkP_Nvl8iToZUWNfOHT42Pg
抖音精選:https://www.youtube.com/playlist?list=PLOAKxvSm6LGmoWuzdrsxoeKQBR_GgZyIk
國中會考總複習:https://www.youtube.com/playlist?list=PLOAKxvSm6LGlbMqjF4W6ElHM_lrFZijkg
![post-title](https://i.ytimg.com/vi/SzBFpsBR-yc/hqdefault.jpg)
c遞迴 在 Re: [問題] 組合Cm取n的遞迴- 看板C_and_CPP - 批踢踢實業坊 的八卦
※ 引述《yauhh (喲)》之銘言:
: ※ 引述《j129008 (j129008)》之銘言:
: : 問題(Question):
: : 無法了解網路上的某篇程式
: goto ......
: : 程式碼(Code):(請善用置底文網頁, 記得排版)
: break ......
: : void make (int now,int a,int n,int m)
: : {
: : int b=a,c;
: : if(now==m+1)
: : {
: : for(c=1; c<=m; c++)printf("%d ",way[c]);
: : printf("\n");
: : return;
: : }
: : else
: : for(b=a; b<=n; b++)
: : {
: : way[now]=b;
: : make(now+1,b+1,n,m);
: : }
: : }
: : main()
: : {
: : while(scanf("%d %d",&n,&m)==2)
: : make(1,1,n,m);
: 先看主程式呼叫 make 函數怎麼呼叫的,
: : return 0;
: : }
: : 補充說明(Supplement):
: : 已經想破腦袋了
: : 甚至使用暴力法把程式怎麼跑的一一列出
: : 結果就是看到函式進入堆疊以後不斷的recurtion就排出答案
: : 最弄不懂的地方是make前面的兩個參數到底是怎麼做到組合的
: : 希望有人可以幫我解答一下
: 主程式先取 n m 二數,表示 C n 取 m 的意思. 這二個數字本身有意義.
: 但是卻會呼叫 make(1,1,n,m) 開始. 前面二個參數看不出意義,但是在程式執行時
: 很重要,因為那些是執行時的中繼變數.
: 從定義 void make (int now,int a,int n,int m) 看到二個變數一個叫 now,
: 另一個叫 a, 很顯然 now 是指目前函式內容中最關注的一項訊息.
: 看一下 now 在 make 函式中出現的位置.
: 1. 在 else 之後第一個 now: 操作陣列中一個位置,使那個位置存入 b, 而 b
: 可能是 a 到 n 之間的數字.
: 2. else 之後第二個 now: now 是陣列中的位置,在下一個遞迴中, now 也變成
: 下一個 now (指 now+1).
: 3. 在 if 判斷中的 now: 如果 now 是 m+1, 而 m 的意思是取 m 的意思,
: m+1 就是指 m 都取完了. 所以 now == m+1 是要結束遞迴. 結束的方法就是
: 把 way 陣列全都印出來. 而 way 陣列在前面 1. 2. 的 now 取值過程中,
: 有收集一些東西,那些東西就是答案.
: 所以看著 make 函式中的迴圈,
: 你可以想像迴圈從上往下把 way 的可能結果展開成一列一列.
: 把 way[now] = b 想像成從上往下在每一列同一個位置依序寫 a,b,c,..., 寫到 n.
: (因為迴圈設定 a 到 n 嘛)
: 然後從迴圈中二行可以看到,前面把一列的前一個位置寫了一個 b, 之後遞迴呼叫
: 一定要給一個 b+1, 顯然這個 b, 即 make 函式的參數 a, 代表一個底數.
: 也就是說 make(now, a, n, m) 意思是在 a 到 n 範圍中取 m 個數字組合,
: 而目前正在取的數字位置是 now.
: 這樣胡言亂語一番之後,不知你是否懂了?
: 假如你看懂了,接下來會發現 make 函式一個怪怪的地方是,如果 n 比 m 小......
標題應該是Cn取m才對XD
總算看懂了XD
根據我的理解,make(now,a,n,m)裡的"now"跟"a"
分別代表著Cn取m取了第幾個與目前要從哪裡開始取
所以它recurtion的方法是
ex:C5取3 代表 C5取1 + C4取1 + C3取1
->>for(b=a; b<=n; b++)
由於從loop上看,第一次可以取1~n
第二次從2~n
第三次從3~n
"now"就是代表取第幾次,所以會 1~m
"a"則是取到的內容,為避免重複所以每取一次便 +1
也就是now+1時他也要+1
所以C5取3
總共會取三次
第一次會從1取到3
第二次從2取到4
第三次從3取到5
為什麼一次只會從1取到3呢?
因為當取4時,now==4什麼也不會印
所以說造成第二次跟第三次都只會取三個 //因為每次都會前進1
但是我還是不懂要怎麼樣想到要這樣設計
我只能說如果他取到4的話那就只剩下一個數字就沒辦法做成組合了
當第一次取1時,第二次就可以從2取到4,這樣就不會重複
第二次如果取到3,第三次就可以從4取到5
我只能說這種recurtion法實在非常不直覺
能想出這種方法的人真是奇才.....
不然就是有人能提供更直覺的想法嗎?
我覺得我的理解方法似乎有些問題......
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.68.131
※ 編輯: j129008 來自: 140.113.68.131 (05/04 06:52)
... <看更多>