Functional Programming Basics - Pascal's triangle

แชร์
ฝัง
  • เผยแพร่เมื่อ 2 มิ.ย. 2024
  • 0:00 Pascal's triangle
    0:19 What the past me would write
    0:39 code walkthrough
    1:17 the problems with the code
    1:52 How to make it pure?
    3:41 adding console.log
    4:14 easy unit testing
    4:22 aren't for loops bad?
    6:20 translating algos into FP implmentations
    影片中使用的Icons: www.flaticon.com
    插圖來源:www.irasutoya.com/
    B roll來源:envato elements

ความคิดเห็น • 71

  • @nacoARC
    @nacoARC 11 หลายเดือนก่อน +30

    個人認為說明一個概念/寫法 使用最單的方式說明是最好的
    因為用來說明的東西大家都很清楚
    如果使用很困難的問題來說明的話
    可能大部分的人都沒有遇過這個問題
    反而會對新的寫法沒那麼有共鳴

  • @DoUNoHarm
    @DoUNoHarm ปีที่แล้ว +75

    不管怎麼簡單的內容都還是有需要看的人。

  • @imladris-nz5hm
    @imladris-nz5hm 6 หลายเดือนก่อน

    這種類型的影片很棒!! 案例清晰、原理淺顯易懂!

  • @kenchen3902
    @kenchen3902 11 หลายเดือนก่อน

    這個觀念教學真的好有幫助,謝謝。
    我一直卡在要用哪種?用哪種比較好?這種問題。
    但都忘記重點是,只要有達成那個作法提供的好處就好,謝謝。

  • @Dev-Creater
    @Dev-Creater 10 หลายเดือนก่อน

    有幫助!! 總有不同的客群需要學習不同階段的東西,謝謝你!!

  • @user-kr2sl2sc3l
    @user-kr2sl2sc3l ปีที่แล้ว +13

    對一個大學以前從未接觸過程式的資工系學生來說 很有幫助

  • @ggg1237890
    @ggg1237890 11 หลายเดือนก่อน +1

    非常喜歡這樣的影片!!
    非本科很需要
    感謝James用心製作影片

  • @yojaychang
    @yojaychang 10 หลายเดือนก่อน +5

    我的話只會用到一個陣列(而不是n個),而且陣列大小只需要一半(因為左右的值是一樣的),另外陣列第一個,第二個元素是不需要計算就能知道的值,所以總計算次數小於一半,空間由N^2(約略n*(n+1)/2)降到N(約略n/2-2)。
    也就是只需要原本少超過一半的計算次數,以及只要一個陣列(存一半,另一半是重複資料就不重複計算儲存了),就可以印出(產出)最終的結果。
    若題目嚴格要求傳回整個完整陣列,則計算過程中一樣維持一個陣列及少一半的計算,只需於傳回最終結果前,將陣列鏡射到另一半元素回傳即可。
    ps. 還有其他方式可以更優化計算時間

  • @TheHuiyu8794
    @TheHuiyu8794 ปีที่แล้ว

    謝謝分享~希望出更多類似的系列

  • @sssos666
    @sssos666 ปีที่แล้ว +3

    講得太好了,希望可以多多推出類似的影片!

  • @ac.23z
    @ac.23z ปีที่แล้ว

    很喜歡這類型的影片 給讚👍

  • @miku3920
    @miku3920 11 หลายเดือนก่อน +4

    用一個狀態算出下一個狀態的情況,我更喜歡用遞迴來解決,好處是我只需要關注在子問題上

  • @parker3266
    @parker3266 ปีที่แล้ว

    最近在刷題剛好在複習這個 感想分享

  • @jameswill1442
    @jameswill1442 ปีที่แล้ว +1

    影片做得挺好的,讚了👍

  • @yuwenhsieh9827
    @yuwenhsieh9827 10 หลายเดือนก่อน

    可以用排列組合的 nCm
    n是列-1 m是位置-1
    第六行是 5C0 , 5C1, 5C2, 5C3, 5C4, 5C5 (到一半就可以返回列出了)
    但階層例如5!/(3!*2!)要減少BigO的話
    就要用一個小型cache(map)去記
    (缺點就是某些語言算階層用一些資料型態很容易就溢位)

  • @user-mineke
    @user-mineke ปีที่แล้ว

    清晰易懂~感謝👍

  • @user-yp2so4gz7q
    @user-yp2so4gz7q 10 หลายเดือนก่อน

    觀念清楚,深受助益

  • @HuangRay2213
    @HuangRay2213 6 หลายเดือนก่อน

    看的一知半解, 但我對Functional Programming 和程式理解也不夠深
    我覺得還是很有收穫, 感覺以後學更多回來看會理解更多

  • @432Hz_Elics
    @432Hz_Elics 9 หลายเดือนก่อน

    讚!! 我也想從事自媒體!! 現在都當員工!!哈哈!! 多多指教 我也在找尋志同道合夥伴! 但我不會程式語言,我強項是軟體硬體安裝應用!! 自己還有用NAS架設網站!! 多多指教

  • @david00700735
    @david00700735 ปีที่แล้ว

    非常剛好符合我的程度 感謝詳細解釋各個名詞意義

  • @radio0529
    @radio0529 10 หลายเดือนก่อน

    感謝你的教學~

  • @psychemist206
    @psychemist206 11 หลายเดือนก่อน

    很喜歡這種解說方式,很受用

  • @JOJO_MAN
    @JOJO_MAN ปีที่แล้ว

    很有幫助!

  • @jacobLan
    @jacobLan 10 หลายเดือนก่อน

    有幫助,謝謝。

  • @Tubasa200
    @Tubasa200 10 หลายเดือนก่อน

    講得很好

  • @YuuJinS_HuakCat
    @YuuJinS_HuakCat ปีที่แล้ว

    受益良多
    感謝

  • @anxier0719
    @anxier0719 ปีที่แล้ว

    有幫助,謝謝

  • @wjchuang2487
    @wjchuang2487 10 หลายเดือนก่อน

    您好,不知道我這樣理解可不可。
    有時會希望可以用一個迴圈做完所有的事情,很怕迴圈多了會效能差。實際上現在的環境,這個已經不是最先需要考慮的,把功能切單純,一個迴圈能做完的兩三件事情,那就用兩三個method各自的任務,這樣之後程式要做單元測試或是復用都會很直覺明瞭。

  • @chihchengh
    @chihchengh 10 หลายเดือนก่อน

    讚一個!

  • @s0101300602
    @s0101300602 11 หลายเดือนก่อน

    感謝教學

  • @yen_s_life
    @yen_s_life 10 หลายเดือนก่อน

    謝謝分享

  • @ftmartin
    @ftmartin 8 หลายเดือนก่อน

    你的这段代码从原来的两层for循环改成FP的递归之后,时间复杂度从原来的O(N^2)变成了O(N^3)了。假设PC上1秒钟可以计算10^9次,原来的源代码可以在1秒内计算3*10^4,而修改后只能计算到10^3。
    对于使用FP书写代码,会不小心增加复杂度,这种应该怎么避免以及优化?

  • @Arnott_me
    @Arnott_me 11 หลายเดือนก่อน

    讚 精簡

  • @user-mf2lo1ws8i
    @user-mf2lo1ws8i 10 หลายเดือนก่อน

    Linux kernel內可以看到C語言OOP的影子!🥰

  • @KeithAirsoft
    @KeithAirsoft 10 หลายเดือนก่อน

    先按讚假裝我看的懂XD

  • @33lee61
    @33lee61 10 หลายเดือนก่อน

    工作上有遇到前人留下的code幾乎都是寫死的 後續再開發常常會遇到unittest的問題 真的很頭痛= =

  • @one0910
    @one0910 ปีที่แล้ว +2

    JAMES您好,滿想聽聽您對於chatgpt的看法,自從chatgpt問世後,對於軟體開發從業人員來說,提升了不少工作效率,以這影片的帕斯卡三角案例來說,只要給予簡單的泳唱語法,很快就能得到答案了
    也就是說以前可能要思考的邏輯運算,現在只要你給chatgpt一個方向及需求,你就能針對它吐出來的結果做調整或修改,我的想法是未來像這種純運算的事,可能會越來越仰賴讓AI去做,軟體工程師的工作就是做需求及系統的整合、運用

    • @morewee1340
      @morewee1340 ปีที่แล้ว +5

      演算法工程師本來就只有前2%的人能好好活著,現在GPT出來頂多讓2%變1%,你會在這裡代表你應該也是個普通人,所以這個倒是不用想太多。

    • @user-sl2vn3ls4e
      @user-sl2vn3ls4e 11 หลายเดือนก่อน +3

      你直接用 chatGPT 給的 code 來用很容易 debug 到很想死,相信我
      現在的 AI 真的還不到能夠超越人類產值的地步

    • @kaijhongjheng6253
      @kaijhongjheng6253 10 หลายเดือนก่อน

      同意這個看法
      這概念類似於你現在要從某字串中尋找文字時,不會徒法煉鋼的用for迴圈
      而是很可能直接使用該程式語言的API,find()之類的函式
      除非是在有限的環境,如C語言
      因此當未來很多基礎與語法概念都被大多人數認同時且放進GPT後
      可能透過詠唱就能取得50%的程式碼
      多出來的時間就用來優化與調教生成的內容,與系統規劃架構
      目前軟體工程師如果真的繼續當碼農,只會複製貼上
      不去思考其邏輯原因與架構,真的很可能就會被取代掉了

    • @yojaychang
      @yojaychang 10 หลายเดือนก่อน

      你知道AI也會debug嗎?

    • @user-sl2vn3ls4e
      @user-sl2vn3ls4e 10 หลายเดือนก่อน

      @@yojaychang 你知道 AI 也會鬼打牆嗎

  • @user-kz9lk9kn4o
    @user-kz9lk9kn4o 10 หลายเดือนก่อน

    我大一的時候要是有看到大大的影片,就不會轉行了⋯⋯

  • @user-ii2ow5eq6v
    @user-ii2ow5eq6v 10 หลายเดือนก่อน

    要動態規劃~

  • @dra0220
    @dra0220 10 หลายเดือนก่อน

    猛一看應該是可以有算式以數學的方式給行數直接返回此行內容,不需要前列資料才能計算,應該才是最佳做法
    仔細一看,恩,我懶

  • @dog90165
    @dog90165 ปีที่แล้ว

    你好,請問可以做一些 Linux 重零開始的教學嗎

    • @james-kool
      @james-kool  11 หลายเดือนก่อน

      可以參考Linux指令教學,自己練習看看~
      如果有特別想看的主題,可以留言在這邊,我會加入主題清單的

  • @user-ql5sy1li9x
    @user-ql5sy1li9x 11 หลายเดือนก่อน

    我甚至連fp是什麼都不知道,不過看這個影片有大概理解那個概念

  • @eir457882
    @eir457882 ปีที่แล้ว

    所以c語言相對來說fp的方式會比較難寫嗎

    • @james-kool
      @james-kool  ปีที่แล้ว +1

      Pure function 的概念還是很有幫助,但除此之外我覺得能發揮的應該有限
      可以參考這篇看看
      www.sevangelatos.com/john-carmack-on/

  • @kuokuo33
    @kuokuo33 ปีที่แล้ว +1

    這題有辦法完全不用loop只用recursion來解嗎?

    • @james-kool
      @james-kool  ปีที่แล้ว +9

      可以,數學上有證明,所有迴圈都可以轉換成遞迴,只要記憶體足夠

    • @lzh97
      @lzh97 ปีที่แล้ว +4

      可以,loop 轉 recursion 有暴力簡單的轉換法,recursion 轉 loop 才比較燒腦 (要自己模擬函數堆疊)。 loop 轉 recursion 的方法是把計數變數當成函數參數,條件不滿足的時候就 return 結束
      例如
      for (let i = 0; i < j; i++) {
      // ...do something
      就是變成
      function loop(i, j) {
      if (i >= j) return;
      // ...do something
      loop(++i, j);

    • @wjchuang2487
      @wjchuang2487 10 หลายเดือนก่อน

      離開學校一陣子了,對於以前我記得很排斥使用遞迴,但感覺最近又開始倡導用遞迴。是因為記憶體問題已經得到解放,以及遞迴本身的程式碼簡潔以及高內聚低、耦合這幾個特性嗎?

    • @lzh97
      @lzh97 10 หลายเดือนก่อน +1

      @@wjchuang2487 硬體性能的進步當然是很主要的因素,跟高階語言的 runtime 實現方法也有關,現在有些語言的程式很有可能不是在系統 stack 上執行,而是分配在 heap 上 (關鍵字: split stacks、contiguous stacks),空間會比只有使用系統 stack 的情況大很多。
      跟編譯技術的發展也有關係,現在 TCO (尾端呼叫最佳化) 很常見,Javascript 的標準也強制要求實做這個最佳化,寫了尾端遞迴它編譯過後就等於迴圈。
      TCO 有很多好處,有一種最佳化策略是拿 TCO 當作模塊化的 computed goto,可以避免分支預測的問題,還能提升快取命中率,例如 WASM3 的解釋器就用了這個手段 (這方法它們取名叫做 M3 strategy)。

    • @CatFtr
      @CatFtr 10 หลายเดือนก่อน

      loop可以直接寫成並行化作業,不用recursion徒增stack吧?

  • @yung-hsiang4635
    @yung-hsiang4635 11 หลายเดือนก่อน

    帕斯卡三角形跟二項式

  • @gamerpotato6667
    @gamerpotato6667 11 หลายเดือนก่อน

    對於fp的理解不深。我覺得只有在function有可預期的重複利用,才會嘗試寫pure function,因此這個例子聽起來不是很適切。
    按小弟寫程式的習慣,的確會把function獨立出來增加可讀性,然而一開始說了目的是為解題,那求快的前提下,這個題目是用不到function的,我會直接處理資料(生成帕斯卡三角形),然後進行輸出。
    感覺目的沒有說的很清楚

    • @play005517
      @play005517 11 หลายเดือนก่อน +2

      目的不需要清楚,因為這是所有工程師都該有的基本素養
      不管你目前當下的目的是什麼,除非明確規定否則永遠要為了未來著想
      是從除非特別要求否則預設只管當下的需求,改變成除非特別要求否則預設顧慮到未來的的可能
      在within constraints的情況下盡可能做到最好

    • @NightSickle
      @NightSickle 10 หลายเดือนก่อน +2

      那給你個情景,今天老師讓你做了這個三角生成的程式,下節課老師讓你改變程式的參數,輸出的格式,或者加入其他功能
      這例子就跟客戶要求一樣,今天他只要這功能,不保證下次他會不會要求加些什麼或是改變些什麼
      所以不需要目的很清楚才去做成這樣,而是在做的時候就考慮了以後的情況,預想以後需要用到所以先這樣設計了,沒用到也沒壞處,養成習慣後寫代碼的時候還能更順一些

  • @JJ-el1di
    @JJ-el1di 10 หลายเดือนก่อน

    楊輝三角還是帕斯卡三角

  • @csonic
    @csonic 10 หลายเดือนก่อน

    我認為如何寫成 pure 不重要,為什麼要寫成 pure 才重要。

  • @yuko5661
    @yuko5661 11 หลายเดือนก่อน

    很忙嘛James,最近很少更新了

    • @james-kool
      @james-kool  11 หลายเดือนก่อน

      最近有點,不過會持續更新的!

  • @yojaychang
    @yojaychang 10 หลายเดือนก่อน

    話說你面試過了沒?

  • @gostjoke
    @gostjoke 10 หลายเดือนก่อน

    這不就DP嗎...

  • @boxunwu1518
    @boxunwu1518 ปีที่แล้ว

    這種題目對於轉職仔來說並不會太簡單啊...😅

  • @Shuo1025
    @Shuo1025 10 หลายเดือนก่อน

    很有幫助!

  • @samlin-sk3el
    @samlin-sk3el 11 หลายเดือนก่อน

    有幫助,謝謝