分享好文,中學生要學電腦嗎?
作者:創新工場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】
同時也有127部Youtube影片,追蹤數超過7萬的網紅電腦學習園地,也在其Youtube影片中提到,【加入】支持電腦學習園地 https://www.youtube.com/channel/UCYkWZY6-NlkU6qEkEtK3s0Q/join ✅購買完整課程內容 https://shopee.tw/alyoou ✅請【訂閱】我們的頻道 如果這部影片對你有幫助的話,請幫我按個讚,給我點...
「遞迴迴圈效率」的推薦目錄:
- 關於遞迴迴圈效率 在 李開復 Kai-Fu Lee Facebook 的最讚貼文
- 關於遞迴迴圈效率 在 洪仲清臨床心理師 Facebook 的最佳貼文
- 關於遞迴迴圈效率 在 俠醫楊智鈞/ 苗栗大千醫院心臟血管外科 Facebook 的精選貼文
- 關於遞迴迴圈效率 在 電腦學習園地 Youtube 的最讚貼文
- 關於遞迴迴圈效率 在 吳老師教學部落格 Youtube 的精選貼文
- 關於遞迴迴圈效率 在 吳老師教學部落格 Youtube 的精選貼文
- 關於遞迴迴圈效率 在 Re: [問題] 關於遞迴加快速度的迷思? - 看板C_and_CPP 的評價
- 關於遞迴迴圈效率 在 i2p-nthu/README.md at master - GitHub 的評價
- 關於遞迴迴圈效率 在 遞迴只應天上有,凡人應當用迴圈!? 程式寫十次, 不如直接演 ... 的評價
- 關於遞迴迴圈效率 在 使用尾遞迴進行有效迭代 - 他山教程 的評價
- 關於遞迴迴圈效率 在 C語言-函數與遞迴 - 鋼彈盪單槓 的評價
- 關於遞迴迴圈效率 在 全鏈比特幣NFT卻存在Github上,「遞歸朋克」的真假之爭 的評價
遞迴迴圈效率 在 洪仲清臨床心理師 Facebook 的最佳貼文
我們話語中的指責和批評越少,別人就越容易聽進我們說的話。
當對方相信我們是真的有興趣理解他們,而不是在操縱事情以達到目的,也不是試圖要取勝或證明對方是錯的,那麼他們就可以停止自我防衛,單純地聽我們在說什麼。
當我們完全理解對方時,就會不由自主地想要幫忙。如果我真的理解你心裡在想什麼、你為什麼想要這項事物,就會很想找到方法來一同努力。相對的,如果我能幫助你,看出為什麼某樣事物對我很重要,彼此重視的優先順序就會改變,也會有更多合作的意願與空間。
取自《正念溝通》
************************************
各位朋友,早安:
當指責少了,理解多了,合作的可能性就增加了—這種說法雖是普通常識,但剛好跟「小我」的特性與社會制約相左,所以在執行上需要刻意學習。
在我們的文化中,即使是最親愛的家人,也不一定能做到「少指責、多理解」的互動模式。尤其選舉一來,家庭被撕裂的狀態,那更是脆弱得讓人不解。
摘文中的例子很棒,一個人的善意與熱情,真的帶來不可思議的改變。戴露.戴維斯是如此,甘地更是典範。
https://www.facebook.com/Psychologist.Hung/photos/a.248192138530437/2754963711186588/
我還是強調,先從理解自己開始吧。不少人對於理解他人有困難,但理解自己又怎麼會容易?
我很容易遇到感覺不到自己情緒的人,有些人甚至在明顯生氣的時候,還是否認自己正在生氣。就更別說,還要去了解:自己的哪個需要,沒被滿足了?!
這本書的內容其實很豐富,不過,因為篇幅所限,這一篇已經是能分享的最後一篇了。祝願您,能常在當下感受自己與對方,這時能有最真摯的連結!
ps. 翻舊帳,是一種不在當下的例子
************************************
當戴露.戴維斯遇上三K黨
【文/ 奧朗‧傑‧舒佛】
戴露.戴維斯是一位非裔美國音樂家與作家,小時候他曾在國外住過幾年。一九六八年,還不到十歲的他就發現人們會因為他的膚色而討厭他。在麻薩諸塞州,他在全是白人的童子軍隊伍裡行進時,人們朝他扔石頭和瓶子。這個事件激發了他對人類態度的好奇心,而且這種好奇持續了一輩子。他很想知道:「你又不認識我,怎麼會討厭我呢?」
幾年之後,戴維斯在馬里蘭州一間全是白人的酒吧演出之後,有名白人男子上前搭話,表示這是他第一次「聽到黑人演奏得和傑瑞.李.劉易斯一樣好」。戴維斯告訴他,傑瑞.李.劉易斯是自己的朋友,而且劉易斯是從黑人音樂家那裡學習演奏的。兩人繼續交談,隨著時間過去,他們成了朋友。這名男子後來更告訴戴維斯幾位當地三K黨領導者的名字。戴維斯為了手邊正在寫的一本書,進一步聯繫並採訪了他們。
戴維斯詢問三K黨成員們對各種議題的看法,並且仔細聆聽。起初,他們從來不會反問戴維斯的想法,認為他是「比較低等的」。然而,經過充滿耐心、友善的交談,以及戴維斯不斷建立真正連結的努力,他們逐漸對戴維斯的觀點也產生了興趣。
正是戴維斯自身的熱情和尊重,慢慢帶出了他們心中的這些特質。
最後,戴維斯和許多三K黨成員成了朋友,他們也在逐漸認識戴維斯之後,改變了自己的信念。許多人離開了三K黨,甚至還把他們的精神標誌白袍與頭套交給戴維斯。
在戴維斯的努力過程中,他透過對話和友誼,說服超過兩百多名三K黨成員離開這個組織。戴維斯可能從未上過非暴力溝通的課,但他明白意圖的力量。當人與人之間建立起真摯的連結時,徹底的轉變是有可能出現的。
***
啟蒙後的自我主義
在對話中,意圖是最強大也最具轉變性的成分。它能塑造我們口語與非口語的溝通方式,並引導對話的走向。如果整本書中你什麼都沒有吸收,我希望你至少能理解在所有互動之中,理解對方這個意圖的重要性,要從好奇與關心出發。
這種理解的意圖,代表著我們在對話走向的基礎上,產生一種根本的轉變。也表示從意識中清除任何指責、防禦、控制或操弄,專注在創造有利於合作的連結品質。我在本書中與你們分享的一切,都是為了達成創造更多的連結和理解而設計的。
要達到這種轉變,我們必須看出自己習慣性反應的限制,以及理解對方這個意圖的價值:它對轉變、創造和完整的潛力。有兩個重要原則支持這一點。第一點貫穿了全書:我們話語中的指責和批評越少,別人就越容易聽進我們說的話。當對方相信我們是真的有興趣理解他們,而不是在操縱事情以達到目的,也不是試圖要取勝或證明對方是錯的,那麼他們就可以停止自我防衛,單純地聽我們在說什麼。
▍原則:指責和批評越少,別人就越容易聽我們說話。
從這個觀點來看,好奇和關心對我們最為有利。如果我們以這種意圖來溝通,無論口語和非口語,都會傳遞出一種訊息:我們是真心感興趣的。這將能創造出相互傾聽和合作的空間。
這也帶出了下一個原則:彼此了解越多,就越容易合作,找出有創意的解決方案。這似乎是不言而喻的道理,但我們總是忽略這個簡單的事實。當我們理解了每個人想要什麼的背後深層原因後,就可以開始合作了。
▍原則:彼此了解越多,就越容易共同合作,找出有創意的解決方案。
我們天生就是這樣,給予時會快樂,看到別人痛苦時會悲憫。為他人奉獻是我們所能擁有的經驗中,最有價值的一種。這種自然的衝動,就像一口取之不盡的善意之井,深藏在人類的心靈之中。
因為這樣的心情,所以當我們完全理解對方時,就會不由自主地想要幫忙。如果我真的理解你心裡在想什麼、你為什麼想要這項事物,就會很想找到方法來一同努力。相對的,如果我能幫助你,看出為什麼某樣事物對我很重要,彼此重視的優先順序就會改變,也會有更多合作的意願與空間。(試想一下:你一開始拒絕某個請求,但更深入理解情況後就答應了。)
這種解決衝突的方法就是非暴力抵抗的核心。當我們向人類同胞發出呼籲,就擁有了更多的力量和正直。這就是甘地的努力、民權運動背後的基本原則,也是盧森堡博士將他的溝通方法命名為非暴力溝通的原因。採取這種方法,並不表示我們是被動的、不堅持自己的觀點,或是不捍衛自己的信念。因為透過運用我們與他人的人性連結,培養理解的意圖,才能更有效率地達成目的。
***
看待事件的另一種方法
戴維斯和許多其他人的故事都是這樣,他們用愛來面對仇恨、種族主義和偏執,這些故事指出了看待世界的另一種方式。當盧森堡提出同理和暴力本質的問題時,尋找的正是這種觀點。這取決於我們在彼此身上尋找人性的能力,並超越我們的分歧,去看到更本質的東西。
所有人類行為都是為了滿足基本的需求。在我們的行為、偏好、信念和欲望底下,是對物質、關係或精神需求的某些渴望。我們需要意義、貢獻、創造力以及和平。(在第七章中會深入探討這個概念。)
在許多宗教、靈性和冥想的傳統中,以及在行為和社會科學中,我們都能發現這種觀點。在佛教中,表述的方式簡潔明瞭:「眾生皆想要喜樂。」我第一次聽到這句智慧之語時就深深為之震撼,直覺告訴我它是對的。幸福到底是什麼模樣因人而異,甚至每天都不一樣,但它的本質是滿足我們的需求。
▍原則:我們做的每件事,都是為了滿足一種需求。
要記住,這個觀點是從好奇和關心出發的關鍵。它能喚起人們的意圖。無論發生什麼事,我們都可以對言語或行為背後那更深層的人類需求和價值觀感到好奇。當我們從需求的層面上相互理解時,相似點超過了差異點,反過來又會創造一個富有生產力且積極的觀點、意圖和經驗迴圈。
這種方法的強大之處在於,它並不局限於親密的關係。無論我們是想和朋友一起享受時光、與同事合作,抑或是建立一個多樣化的聯盟,只要帶著真心想理解對方的意圖,都有能力創造或加強彼此的連結(為了連結本身,以及為了滿足需求)。
要把它應用到對話中,得先做幾件事。首先,我們需要培養發自好奇和關心的能力,必須真正的理解,帶著真摯的意圖去理解對方有什麼樣的感覺,這樣我們才可以隨時把思想帶入對話。再者,需要訓練自己去注意,我們什麼時候會按照自己的習慣傾向行事。最後,則要學習如何找回好奇和關心。
.
以上文字取自
正念溝通:在衝突、委屈、情緒勒索場景下說出真心話
https://www.books.com.tw/products/0010843714
圓神出版.書是活的
.
改為線上直播_5/15 台北免費公益講座_談家庭衝突調適
https://www.facebook.com/events/1266384843569683/
5/24 基隆免費公益講座_創作我的幸福
https://www.facebook.com/events/2994369237288959/
7/16-17免費台北市教師研習_非暴力溝通_如何讀懂愛的語言
https://www.facebook.com/events/519814295382140/
11/7 三重免費公益講座_樂讀親子共學系列講座_以善意應對青少年情緒人際問題
https://www.facebook.com/events/189917322447609/
相信自己是夠好的媽媽:是犧牲,還是責任?是妥協,還是平衡?放下對母愛的執著,恢復你的生命彈性,重新找回愛自己的方式
博客來:https://bit.ly/2vhVD9s
讀書花園:https://bit.ly/2GEA9dH
誠品:https://bit.ly/2W4E3Sq
金石堂:https://bit.ly/2vhQ6jh
遞迴迴圈效率 在 俠醫楊智鈞/ 苗栗大千醫院心臟血管外科 Facebook 的精選貼文
感謝老爺子又幫我們帶來新知識,不過我稍微更正一下:
1. 心臟手術沒有危機四伏,至少在我這裡動刀,成功率幾乎 100%。
2. 你講的那個像是「TAVI 經皮主動脈瓣膜置放術」,嚴格來說不算「開心手術」。
3. 至於主動脈瓣膜狹窄要怎麼治療的議題,我近期會彙整一下寫一篇分析。
#科技發展總體來說是好的
#但不代表每個面向都是有幫助的
#當然我能體諒科技公司採取比較炫的說法可以募到比較多的融資
復活死亡大腦、在心臟“自動駕駛”……醫療科技正在重新定義死亡
有史以來,人們對於“死亡”的理解和定義在不斷更新。
最早判斷一個人是否死去是大喊患者的名字三聲,或者把鏡子貼到他們鼻子下面,看鏡面是否會生成霧氣。到了19世紀,法國科學院甚至推出了一項“明斷生死,防止活埋最佳方法獎”,集思廣益,來幫助醫療機構確定死亡標準。
今天跟大家分享近期醫療科技取得的一系列進展:機器人引導心臟瓣膜手術、腦波合成語音、AI工具能預測病人死亡時間、豬大腦在“死亡”4小時後復活……
隨著醫療科技的發展,更多不治之症被攻克將是大勢所趨。這些突破一次次刷新人們的認知,讓人疑惑並且期待著——在未來,醫療科技會不會再次推進人類對生命的認識,重新定義死亡?(耐心看,文末有彩蛋哦)
▍機器人引導手術,在跳動的心臟裡“自動駕駛”
心臟是人體循環系統的核心,是脊椎動物最重要的器官之一,為心臟做手術危機四伏。目前,治療心臟瓣膜疾病需要進行導管插入術,要求醫生手動把導管送到心臟瓣膜的漏點。人類醫生在手術中會受到心跳的強烈干擾,稍不小心就會出現差錯。
近期,哈佛醫學院的研究人員用機器人自動完成導管的引導至心臟瓣膜的漏點,完全不用人類醫師的導航。
心臟這樣複雜的環境裡,機器人是如何找路的呢?
科學家說,是蟑螂和老鼠給了他們靈感。當然,也少不了機器學習演算法的助力。一方面,機器人具有視覺處理能力。研究人員設計了一種基於機器學習的圖像分類器,可以區分血液、心室壁組織和生物假體主動脈瓣膜,準確率高達97%;另一方面機器人具有蟑螂觸角一樣的觸覺。研究人員在前端加入了“光須”(optical whisker),機器人可以像蟑螂用觸角、老鼠用鬍鬚探測物體一樣,通過力的大小來計算導管前端與心臟內壁的距離。結合視覺、觸覺兩種感知能力,它可以在心臟內自動遊走,尋找心臟瓣膜洩漏的位置。所以科學家們把它叫做“觸覺視覺自主機器人”。
機器人導管在跳動著的豬心臟裡進行了測試,在完成時間和效果上表現可媲美人類醫生。但研究人員表示,這項技術進入手術室還需要幾年的時間。一旦觸覺視覺自主機器人導管技術成熟、投入使用,可能給心臟外科手術帶來不小的變革。將為醫生省去手動導航的步驟,專注在更加關鍵的手術步驟上,避免疲憊造成的動作變形,保證手術品質。就像飛機的自動駕駛,解放了飛行員那樣。
另外,雖然現在這項研究是用於心臟,但“在人體裡自動駕駛”的做法,還可以有許多其他用處。研究團隊指出,腦血管、氣道、胃腸道、腦室系統等不同部位的病症,都可以用這種方法來做微創手術。
▍腦波合成語音,語言障礙者的福音
只要靜靜坐著,世界就能聽到你的聲音,這樣的畫面你可曾想像過?
是的,不必動手,也不必開口,只要你的腦波流轉,AI就能以每分鐘150個詞的速度幫你說出心聲。
2019年4月24日,Edward Chang團隊在Nature雜誌發表了腦電波合成語音的研究成果。據悉,研究人員設計了一種神經解碼器,採用迴圈神經網路的方式將記錄的皮質神經信號,然後編碼咬合關節運動的表徵,以合成可聽語音。也就是說,不需要任何一塊肌肉參與,機器就能直接讀懂大腦,解碼腦中所想,實現流暢交流。
Edward Chang團隊也放出了一段清晰可理解的語音例子:前半部分是參與實驗的閱讀者讀出的句子,後半部分是通過記錄患者大腦活動,自動產生的句子的。
用外部設備生成輔助語音輸出早已有之。我們之前所熟知的,例如霍金使用的語音合成器,是通過人類眼睛和面部動作來拼寫單詞,在理想情況下,可以説明癱瘓者每分鐘輸出多達8 個單詞。但這個新的裝置每分鐘能生成150 個單詞,接近人類的自然語速。
語音障礙者廣泛存在。由於各類事故、中風或神經退行性疾病(如肌萎縮側索硬化症或肌萎縮側索硬化症)中受傷而導致言語能力喪失,成千上萬的人無法進行正常的交流。這些病患可以使用基於該技術的產品通過大腦皮層活動更有效地向任何人發送文字資訊,必須說明的是,這項技術使用的腦電電極陣列需要通過開顱手術來放置到大腦中,對於飽受疾病、意外之害而失去語言能力的患者來說是福音天降,但更大範圍的臨床應用還有很長的路要走。
▍AI工具預測病人死亡時間
2018年1月,斯坦福大學與互聯網巨擘Google,合力研發出一套革命性的人工智慧系統。該系統透過醫療記錄、年齡、種族、體溫、呼吸率和心跳等資料,設計全新演算法預測病人的死亡時間。
很多病人臨終前希望在家裡度過,但大部分會在醫院中死亡,如果能提前知道病人的死亡時間,醫院和患者家屬就能及時做一些準備,給病人更好的關懷。
斯坦福大學的研究團隊用醫院的健康記錄訓練了一個深度神經網路,資料包含200 萬名患者,這些實際資料可以説明建立一個「死亡預測」模型,結合醫生的評估,就可以在病人臨終前做出更合理的規劃。
斯坦福大學團隊希望系統收集更多資料後,可正式投入使用。當資料規模足夠大時,就可以建立一套全死因死亡率(all-cause mortality)預測系統,而非只局限於某種疾病或某些年齡段。
▍死亡似乎不再神秘,成了可以被計算、被預估的事情。
毫無疑問,人工智慧將在個性化醫療的發展中扮演關鍵角色,這項技術在一定程度上可以幫助醫生進行更精准的判斷。但我們也希望在這個過程中,能夠保證的是病人從AI 技術中受益,而不是面對更多面對死亡臨近感的壓力。
死亡豬大腦復活,“腦死亡”能否宣告生命終結?
4月19日,Nature封面重磅發佈耶魯大學最新研究:豬大腦在死亡4小時後成功“復活”,恢復了腦迴圈和部分細胞功能,並維持了至少6小時。
該系統名為BrainEx,是一套類似透析機一樣的體外人工迴圈程式,研究者將大腦從頭骨上移開放入一個特殊的腔室,然後用導管將實驗溶液泵入大腦。研究人員測試了豬大腦在六小時內的功能。結果發現,神經元和其他腦細胞重新開啟了正常的代謝功能,不斷消耗糖並產生二氧化碳。而且,大腦的免疫系統似乎也在發揮作用。
1950年,腦電圖(EEG)誕生,顛覆了人們對死亡的認知,“腦死亡”被學界認定為判斷死亡的新標準。從那時起,腦死亡即宣告著生命活動的終結。這個觀點在醫學界和法律界也盛行已久。但復活死亡大腦的實驗卻對“腦死亡”的不可逆轉性提出質疑。
目前而言,這項技術雖不能讓人長生不老,但在醫學領域是一項重大突破。該技術並非旨在實現腦移植或大腦功能的長期維持,而是用於提高我們對大腦組成和功能的理解,並為昏迷患者、癌症患者和患有癡呆症的人以及其他神經系統疾病開發潛在的療法。同時這項技術未來有潛力對人類心臟病或中風等疾病導致的腦死亡發揮作用。在世界大多數國家中,當大腦活動停止或心肺停止工作時,可以認為人已經“合法死亡”。
但現在,技術正在攻克越來越多的不治之症。也許到了未來的某一天,心臟停跳與腦死亡也不再是生死的界限。到那時,人類必須重新思考,到底什麼才是不可逆轉的“真正”死亡。
▍One more thing
one more thing,給大家介紹一下創新工場人工智慧工程院醫療AI實驗室和醫療投資團隊,及聯繫方式。
醫療AI實驗室關注“AI + 醫療”領域中多門類大健康資料的積累與標注,並在此基礎上利用AI技術幫助醫生提升診療效率和效果,幫助患者提升健康認知水準,幫助醫療機構提升就診過程中的醫患整體滿意度。
醫療AI實驗室涵蓋醫美整形、醫學影像輔助診斷、病理切片病灶識別、人體骨骼關鍵點檢測、人體行為估計、腫瘤基因圖譜基因拷貝數變異分析等多個領域,涉及電腦視覺、3D建模、AR & VR、自然語言處理等核心技術。
尋求跟醫療AI實驗室合作可聯繫:zhangxiaolu@chuangxin.com
醫療創業公司融資BP投遞通道:healthcare@chuangxin.com
遞迴迴圈效率 在 電腦學習園地 Youtube 的最讚貼文
【加入】支持電腦學習園地
https://www.youtube.com/channel/UCYkWZY6-NlkU6qEkEtK3s0Q/join
✅購買完整課程內容
https://shopee.tw/alyoou
✅請【訂閱】我們的頻道
如果這部影片對你有幫助的話,請幫我按個讚,給我點鼓勵,也多分享給需要的朋友們喔~
➡️訂閱我們的頻道
主頻道:https://pse.is/pclearncenter
OFFICE辦公室應用: https://pse.is/office
AutoCAD電腦製圖: https://pse.is/AutoCAD
美工設計: https://pse.is/PSAI
軟體應用: https://pse.is/soft
影片剪輯: https://pse.is/mclip
➡️FB粉絲團
https://www.facebook.com/pclearncenter
推薦課程
【illustrator CC AI基礎教學】
https://www.youtube.com/watch?v=fA4LTxGpOH0&list=PLwwPq48LW7z-2MFp-jA1a_IQLU7fe9ZjT
【PowerPoint PPT教學】
https://www.youtube.com/watch?v=rKNStKEFoW0&list=PLwwPq48LW7z-Rp_6BCqHTXha3F-BPpAPw
【Microsoft Excel教學】
https://www.youtube.com/watch?v=Vl0febV7Kmc&list=PLwwPq48LW7z_uFzBKXFsU0KZqSP7Ky_Up
【Excel VBA程式設計教學】
https://www.youtube.com/watch?v=bUNP9lVbSWc&list=PLwwPq48LW7z_vK171m2neLyz0GzyqRCZH
【Micorsoft Word教學】
https://www.youtube.com/watch?v=J8PpOwwcK7Q&list=PLwwPq48LW7z86-TqMtDejWBKjZD9u1_Rj
【PS教學Photoshop】
https://www.youtube.com/watch?v=kbMyyt8WS6M&list=PLwwPq48LW7z9lyFs6xEiae4uDddWJ1x9e
【會聲會影X9 影片剪輯教學】
https://www.youtube.com/watch?v=QfcXIC_l33Q&list=PLwwPq48LW7z8CNIHEPi3lrQwJMAv-ceiW
【AutoCAD製圖教學】
https://www.youtube.com/watch?v=W7kGvMBgdEs&list=PLwwPq48LW7z_g02sbOzipI3_y1HIyXEUN
#電腦教學 #軟體教學 #教學影片
遞迴迴圈效率 在 吳老師教學部落格 Youtube 的精選貼文
EXCEL VBA辦公自動化二班第13次(問題20案例3郵遞區號For迴圈&郵遞區號While迴圈&問題21西曆轉中曆程式&問題22自動行程安排說明&自動行程安排輸入程式碼&修改)
上課內容:
01_問題20案例3郵遞區號For迴圈
02_問題20案例3郵遞區號While迴圈
03_問題21西曆轉中曆程式說明
04_問題21中曆轉西曆程式說明
05_問題22自動行程安排說明
06_問題22自動行程安排(輸入程式碼)
07_問題22自動行程安排(修改)
完整影音
http://goo.gl/aQTMFS
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/forum/#!forum/tcfst_excel_vba2_2016_2
吳老師excel函數與vba大數據教學
https://www.facebook.com/scuexcelvba
新課程EXCEL VBA辦公自動化順利在自強基金會開始第一次上課,
主要目標能延續入門課程,進一步延續前課程,把函數變成VBA,
VBA設計自動化與VBA與資料庫當成重要課程目標。
課程理念:
1.以循序漸進的方式, 透過詳細的說明和實用的50個Excel VBA範例,
帶領您輕鬆進入 Excel VBA 設計的領域, 並逐步了解整個 VBA 的架構與輪廓,
進而學習 VBA 變數、常數、函式及邏輯的觀念, 即使沒有任何程式設計基礎,
也能自己親手撰寫 VBA 程序來提昇工作效率, 晉身職場 Excel 高手!
2.進而解說EXCEL與資料庫的結合,甚至將EXCEL當成資料庫來使用,
結合函數、VBA等更深入的功能,讓資料處理和分析的應用更上層樓。
3.將結合GOOGLE雲端試算表,教您如何將EXCEL函數雲端化與網路化。
上課用書:
參考用書:
—Excel職場函數468招:超完整!新人工作就要用到的計算函數+公式範例集
—作者: 羅剛君
—出版社:PCuSER電腦人文化
—出版日期:2016/01/30 —定價:450元
Excel VBA一點都不難:一鍵搞定所有報表
作者: Excel Home
出版社:博碩
出版日期:2013/06/26
定價:380元
EXCEL VBA之前上課完整教學影音DVD申請
http://goo.gl/aQTMFS
吳老師 105/3/9
函數,東吳進修推廣部,自強基金會,程式設計,線上教學excel vba教學電子書,excel vba範例,vba語法,vba教學網站,vba教學講義,vba範例教學,excel vba教學視頻
遞迴迴圈效率 在 吳老師教學部落格 Youtube 的精選貼文
EXCEL VBA辦公自動化二班第13次(問題20案例3郵遞區號For迴圈&郵遞區號While迴圈&問題21西曆轉中曆程式&問題22自動行程安排說明&自動行程安排輸入程式碼&修改)
上課內容:
01_問題20案例3郵遞區號For迴圈
02_問題20案例3郵遞區號While迴圈
03_問題21西曆轉中曆程式說明
04_問題21中曆轉西曆程式說明
05_問題22自動行程安排說明
06_問題22自動行程安排(輸入程式碼)
07_問題22自動行程安排(修改)
完整影音
http://goo.gl/aQTMFS
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/forum/#!forum/tcfst_excel_vba2_2016_2
吳老師excel函數與vba大數據教學
https://www.facebook.com/scuexcelvba
新課程EXCEL VBA辦公自動化順利在自強基金會開始第一次上課,
主要目標能延續入門課程,進一步延續前課程,把函數變成VBA,
VBA設計自動化與VBA與資料庫當成重要課程目標。
課程理念:
1.以循序漸進的方式, 透過詳細的說明和實用的50個Excel VBA範例,
帶領您輕鬆進入 Excel VBA 設計的領域, 並逐步了解整個 VBA 的架構與輪廓,
進而學習 VBA 變數、常數、函式及邏輯的觀念, 即使沒有任何程式設計基礎,
也能自己親手撰寫 VBA 程序來提昇工作效率, 晉身職場 Excel 高手!
2.進而解說EXCEL與資料庫的結合,甚至將EXCEL當成資料庫來使用,
結合函數、VBA等更深入的功能,讓資料處理和分析的應用更上層樓。
3.將結合GOOGLE雲端試算表,教您如何將EXCEL函數雲端化與網路化。
上課用書:
參考用書:
—Excel職場函數468招:超完整!新人工作就要用到的計算函數+公式範例集
—作者: 羅剛君
—出版社:PCuSER電腦人文化
—出版日期:2016/01/30 —定價:450元
Excel VBA一點都不難:一鍵搞定所有報表
作者: Excel Home
出版社:博碩
出版日期:2013/06/26
定價:380元
EXCEL VBA之前上課完整教學影音DVD申請
http://goo.gl/aQTMFS
吳老師 105/3/9
函數,東吳進修推廣部,自強基金會,程式設計,線上教學excel vba教學電子書,excel vba範例,vba語法,vba教學網站,vba教學講義,vba範例教學,excel vba教學視頻
遞迴迴圈效率 在 i2p-nthu/README.md at master - GitHub 的推薦與評價
下面的內容,我希望能用簡單的例題來讓大家慢慢上手,體會遞迴和迴圈的不同,大家 ... 通常使用recursion 的解法會比較漂亮,但是可能會比較沒有效率,使用的資源也會 ... ... <看更多>
遞迴迴圈效率 在 遞迴只應天上有,凡人應當用迴圈!? 程式寫十次, 不如直接演 ... 的推薦與評價
施主還是乖乖寫 迴圈 吧--09:17 不想看程式--# 迴圈 # 遞迴 #recursive #forloop 遞迴 只應天上有,凡人應當用 迴圈 !? 程式寫十次, 不如直接演一次. ... <看更多>
遞迴迴圈效率 在 Re: [問題] 關於遞迴加快速度的迷思? - 看板C_and_CPP 的推薦與評價
※ 引述《crazycat2 (浪無定所)》之銘言:
<deleted>
: 但因使用方式,還是以遞迴為主。
: 不經好奇若將遞迴改成static或是marco會更快嗎?
最近也對遞迴有些疑惑, 趁此機會來跟大家討教一下, 以下是我自己的觀點跟想法:
遞迴與迭代這兩個觀念可以在三個層次上遇到:
1. 抽象層次: 遞迴關係 (recurrence) 與迭代關係 (iteration)
2. 語言層次: 遞迴函式呼叫 (recursive function call) 與迴圈 (looping)
3. 底層實作: 呼叫 (call) 與跳躍 (jump) [一般呼叫的實作會包括跳躍]
其中這三個層次有一個直觀的串連關係。例如, 如果有一個題目在抽象層次具有遞迴關
係, 我們就可以依照該遞迴關係去寫語言層次的遞迴函式並呼叫他。這遞迴函式呼叫在
編譯時, 編譯器可以直觀的使用底層呼叫 (call) 類的指令去實作。遞迴關係、遞迴函
式呼叫與底層呼叫這三個不同層次的詞可以有這樣一個直觀的串連關係。相對地,迭代
關係、迴圈與跳躍也可以發現有類似的串連關係。只是這些串連關係並不具有強制性,
像是迴圈也可以用來實作遞迴關係,跳躍也可以用來實作遞迴呼叫,只是可能會有一些
其他的限制或多餘的步驟。不過大致上我們可以具有一個選擇的標準:我們希望在語言
層次可以寫簡短且容易了解維護的程式碼, 同時希望在編譯後於底層實作上具有高的運
作效率。
首先,要認知在這樣的前提上,已經接受在抽象層次上我們要解決的題目是具有直觀的
遞迴關係的,要不然我們沒必要討論這個問題 (就不要用遞迴就好)。 常見的例子像是
要求得 Fibonacci 數列中某項的值。Fibonacci 數列最直觀的定義就是使用遞迴關係
來表示:
f(n) == f(n-1) + f(n-2), (n > 1) [遞迴關係]
f(n) == n , (n <= 1) [邊界條件]
因為具有遞迴關係,所以在語言層次上我們依照這樣的遞迴關係去定義一個遞迴函式並
呼叫是再直觀不過的實作方法:
int f(int n) {
if (n <= 1) return n; // [邊界條件]
else return f(n-1) + f(n-2); // [遞迴關係]
}
但是我們也知道 Fibonacci 數列中每一項的值可以使用迴圈型的演算法算出,因為遞
迴關係可以反向地看成是迭代關係:
n == f(n) , (n <= 1) [初始條件]
f(n-1) + f(n-2) == f(n), (n > 1) [迭代關係]
所以當我們說『遞迴的效率比迴圈差』這個論述時,指的是在語言層次使用遞迴函式呼
叫實作會比使用迴圈實作效率要來得差,而不是說具有遞迴關係的題目本身就象徵著效
率不會好。
那為什麼在語言層次使用遞迴函式呼叫實作感覺上會比使用迴圈實作差?
最常見的範例就是跟計算 Fibonacci 數列的某項值時一樣,遞迴函式呼叫時會『重複』
呼叫具有相同參數值的同名函式。例如要計算 f(10) 時, f(8) 就會在計算 f(10) 跟
f(9)時都被呼叫並重新計算一次。這個會造成效率指數性的下降,也就是我們直觀地使
用遞迴函式呼叫去實作遞迴關係時踩到的效率陷阱。
那為什麼迴圈會是擺脫這個效率陷阱的救星呢?
// 下面的程式碼為了做好的對應,我並沒做最簡化
// 如果要求取 f(10) 的值:
int main() {
int F[10+1];
for (int i = 0; i <= 10; ++i) {
if (i <= 1) F[i] = i;
else F[i] = F[i-1] + F[i-2];
}
// 此時 F[10] 的值就是我們要的 f(10) 的值
printf("%d\n", F[10]);
return 0;
}
這個迴圈確確實實不多不少執行了 10+1 次,看起來要比使用遞迴函式呼叫少執行了很
多次計算 (因為我們沒有重複計算到) 。但是關鍵其實是因為這裡偷偷做了一個類似快
取的機制 (空間換取時間)。也就是說,我們也可以依樣畫葫蘆地把遞迴函式呼叫改成:
int f(int n, int *F, bool *visited) {
if (visited[n]) return F[n];
visited[n] = true;
if (n <= 1) {
F[n] = n;
} else {
F[n] = f(n-1, F, visited) + f(n-2, F, visited);
}
return F[n];
}
int main() {
int F[10+1];
bool visited[10+1] = {};
printf("%d\n", f(10, F, visited));
return 0;
}
我們維持了語法中的遞迴函式呼叫機制,並且通過類似快取的機制避免了重複計算,但
是也必須為此付出一些代價:我們需要記錄是否已經計算過 (visited)。但是相對地,
為什麼迴圈可以不用跟這裡一樣要付出記錄的代價?原因是因為遞迴關係如果要有解 (
也就是遞迴函式呼叫如果要確定能夠結束) ,那所有遞迴函式的呼叫可以依照呼叫者跟
被呼叫者的關係畫成一個樹的結構。我們只要確保在樹枝中比較接近樹葉的函式呼叫比
比較接近樹根的函式呼叫先計算,那最後的結果就會正確。也就是說,我們可以將他寫
成迴圈形式而不用記錄執行過哪些函式是因為存在一個計算的順序可以確保過程中被呼
叫者的值會比呼叫者先被算出來。例如只要確保迴圈中 f(6) 比 f(7) 跟 f(8) 先求出
就可以了。
那遞迴函式呼叫難道就不能做嗎?顯然不是:
void f(int n, int *F, int i = 0) {
if (n < i) return;
if (i <= 1) F[i] = i;
else F[i] = F[i-1] + F[i-2];
f(n, F, i+1);
}
int main() {
int F[10+1];
f(10, F);
// 此時 F[10] 的值就是我們要的 f(10) 的值
printf("%d\n", F[10]);
return 0;
}
(確實有更簡單的方式來寫這個題目,不過跟這裡要討論的差異無關就不細寫。)
如果這樣寫的話,在語言層次,我們保留了遞迴函式呼叫的機制,但似乎有一些多餘的
代價,只是並不那麼地明顯,至少直觀上沒有顯著會慢很多的理由。此時我們可以開始
討論底層實作的層面。在具有遞迴函式呼叫的程式碼經過編譯器編譯後,一般的硬體結
構要實作呼叫 (call) 會比單純的跳躍 (jump) 要複雜,簡單的理由就是每次呼叫要記
得回傳時回來的位址,還有要儲存目前函式內部變數的狀態,以免到時回傳回來後原本
的資料都遺失了。因為這種遞迴的形式是將遞迴呼叫放在遞迴函式定義的最後一行 (且
只有一次),也就是所謂的尾端遞迴 (tail recursion) 或尾端呼叫 (tail call) 。事
實上我們不必去儲存每次呼叫回傳時要回來的位址,因為最後回傳時都會經過一連串的
回傳後回傳到第一個呼叫者,所以我們只需要記得第一個呼叫者的位置。同時我們也不
用在呼叫後還儲存著目前函式內部變數的狀態,因為回傳回來後除了繼續回傳回去也不
會做任何事。
現代的編譯器在你適當的表示成上述尾端呼叫的程式碼時,可以幫你做尾端呼叫最佳化
(tail call optimization),避免在底層實作時使用呼叫 (call) ,所以原則上可以做
到跟迴圈幾乎無差別的效率。甚至如果你迴圈寫得不好 (例如不良的使用迭代器), 反
而寫得好的遞迴會比較快。
以上是假設遞迴關係本身是獨立的計算,不牽涉到外部操作 (例如使用 cout),也就是
我們不用去保證不同樹枝之間呼叫的先後關係。這在實務上其實很少遇到,一般我們遇
到的是像漢諾 (Hanoi) 塔這類的遞迴關係,也就是遞迴函式執行的順序會影響最後的
結果。所以為了保證執行順序,在使用迴圈實作遞迴關係時,我們會需要使用類似堆疊
的結構來模擬,此時遞迴跟迴圈的效率優劣就更難說,反而會與你是否有好好的寫程式
碼有比較大的關係。此外,用迴圈實作遞迴關係是在我們對於參數值有個好的順序 (例
如從 0 算到 10) 的情況下,才容易使用類似快取的機制。如果參數空間太大,而實際
上使用的參數值組合不多,快取機制會更難做而沒效率。不過這都是後話, 我想我有空
再補完.....
結論,在語言層次實作遞迴關係時用遞迴函式呼叫跟迴圈哪個方式好還是跟你的寫法和
編譯器有關。用迴圈實作會 "大幅地" 改進效率通常是因為我們偷偷在其中增加了其他
機制與特性,而這些機制與特性其實遞迴函式呼叫也都可以用只是你沒用,也就是你用
了一個比較聰明的方法去欺負一個比較簡單的方法。
--
寫一寫發現好像大部分是常識, 我錯了...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.217.49
... <看更多>