排列組合問題

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

筆者最近在 brilliant.org 解 Reframing Problems for the AMC 時,看到有一個解題方法,筆者以自己理解的方式詮釋一次。

題目:有五顆相同的籃球要分給三個不同的隊伍,請問有幾種分法?
解法一「個別列出」
假設三個隊伍的名稱為A、B、C,在不考慮排列的情況下,有底下幾種分法(由大到小來組合):
5 0 0 --> 組合一
4 1 0 --> 組合二
3 2 0 --> 組合三
3 1 1 --> 組合四
2 2 1 --> 組合五

加上排列後,
5 0 0 --> 組合一 ==> 3種排列方式
4 1 0 --> 組合二 ==> 6種排列方式
3 2 0 --> 組合三 ==> 6種排列方式
3 1 1 --> 組合四 ==> 3種排列方式
2 2 1 --> 組合五 ==> 3種排列方式
所以總共有 3 + 6 + 6 + 3 + 3 總分法。

解法二『轉換成組合問題』
這方法是將原本的排列組合問題變成排列問題,請先看下圖:
上圖中圓形代表球,長方形代表分割的地方,由上往下分別對應組合一、組合二、組合三、組合四、組合五。由此圖可以看出,原本的問題可以變成組合問題:【從七個相同的東西選兩個出來,有幾種選法?】答案就變成
 \[\binom{7}{2} = 21\]

那原本的問題有沒有變得容易算出呢?

練習題
有十顆相同的糖果要分給四個不同的小朋友時,請問有幾種分法?
 \[\binom{13}{3} = 286\]

參考資料:
[1] https://brilliant.org/practice/reframing-problems-for-the-amc/?p=6

程式設計師的斜桿人生

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

最近筆者在閱讀《斜槓青年》一書,想起很多的Programmer都會在自己的履歷上,用類似底下的文字敘述來描述自己所會的程式語言
C/C++/Java/Python
而 這個符號所使用的英文單字正好是Slash。

不過此書所說的斜槓意思可不只是這樣子而已,所以有些Programmer會這樣子寫:
Web/OS/Alg/Driver/Game Software Developer
恩,會這些的Programmer是書上所提的斜槓人生嗎?這還不是。
以AlphaGo的推手之一的黃士傑來說,他本身是台灣圍棋業餘六段,也就是說至少他的人生經歷可以寫成像這樣子:
程式設計師/圍棋業餘六段
OK,到這邊若還看不出來此書作者的意思,那請看底下引用《斜槓青年》的說明:
對於一個斜槓青年最重要的是:  不是身兼很多種賺錢的方式,而是擁有許多真正熱愛的事物。  透過不同管道,讓你的才華和機會超/展/開!
這樣子的思維(或者說是態度)對一個Programmer是很重要的,因為若沒有真正熱愛的事物,一個Programmer可能只是會把Programming當作一個賺錢的技能,這樣也沒什麼不好,畢竟生存壓力與熱愛的事物不見得能擺在天平上一起衡量。

好,容筆者修改一下《斜槓青年》的說明,變成斜槓程式設計師
對於一個程式設計師最重要的是:  不是身兼很多種語言的技能,而是擁有許多真正可用的專案。
  透過不同管道,讓你的專業履歷超/透/明!
為什麼筆者要這麼說呢?隨著人工智慧與大數據的關係,公司的人資部的一些工作會被機器人所取代,例如自動化履歷篩選。而現在也有很多獵人頭會做媒合的事情,而這件事筆者相信未來會有自動化系統協助做這事,於是獵人才機器人會在網路上尋找適合的人才,或許不是所有產業找人才都會是這樣子,但針對Programmer相關的工作,這個趨勢是很有可能的,屆時沒有將自己的專業與履歷公開的人,就少了一些被動機會。(被動機會變成被動收入是很多人的夢想。)

當程式設計遇上國文造句

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

底下是筆者最近在思考「不開機學程式設計  Teach Programming With Computer」所想到的主,就是來造句吧!含有幾個主題:
  • 變數命名。
  • 判斷敘述。
  • 重複敘述。
  • 判斷敘述加上重複敘述。

變數命名

變數命名通常是找出一個名詞,例如在班級裡學習的人通常是學生,於是可以用學生這個名詞來代表一個班級的一個(或多個)人。
變數命名可以使用這個句型:「.........叫做......」,當然還有其他思考方針,例如這個變數的用途等。以這個句型為基礎時,可以思考底下的問題:

  • 自己的爸爸又叫做「父親」以及什麼?
  • 自己的媽媽又叫做「母親」以及什麼?
  • 有四個輪子會動的東西叫做?
  • 可以用來買東西是什麼玩意兒?


底下是說笑的,請勿當真。
「40年前,天天在教室裡打學生罵學生的人叫做老師。」
「現在,天天在教室裡被嗆聲的人叫做老師。」

此時就可以用 Scratch 裡的變數功能來做一些說明,並講解變數是個類似容器的觀念。請參考底下影片學習如何在Scratch使用變數。

或是筆者所錄製的影片:在Scratch中建立變數

判斷敘述
「如果......」
如果今天表現好,就會有糖吃耶!
如果今天下雨,就不用在室外上體育課!
Scrach範例網址:https://scratch.mit.edu/projects/201559799/


「如果...否則...」
如果今天下雨,就不用在室外上籃球;否則就在體育館上羽球。
如果邀請小花一起出去玩,就可以知道小花喜歡玩什麼;否則就得宅在家用FB聊天了。
Scrach範例網址:https://scratch.mit.edu/projects/201560395/

重複敘述

同樣的事要做幾次呢?例如下面的句子
「罰寫100次。」
「掃教室一周。」
「玩遊戲一小時,連續三周。」
Scrach範例網址:https://scratch.mit.edu/projects/201560922/

判斷敘述加上重複敘述

「如果...重複...次」
【如果...重複...次;否則重複...次】
如果這次三分球投不進,就在罰球線投球投十次。
Scrach範例網址:https://scratch.mit.edu/projects/201561705/

以上用幾個例子並搭配Scratch範例來說明國文也是含有一些運算思維的。