Functional programming ชื่อไทยคือ “การโปรแกรมเชิงฟังก์ชั่น” ชื่อย่อ FP เป็นแนวคิดหนึ่งของการเขียนโปรแกรม (programming paradigm) ชื่อขึ้นต้นด้วย functional แต่ไม่ได้มีดีแค่ประกาศ function ปุ๊บเสร็จ แล้วเรียกใช้ มันมีเบื้องลึกมากกว่านั้นแน่ๆ
🤔 มันจะต่างจากการเขียนโปรแกรมทีละสเตป ตามลำดับก่อนหลัง มีการวนลูป ที่เน้นแก้ state ของโปรแกรมเป็นหลัก
แต่แนวทาง functional programming จะไม่แก้ state ของโปรแกรมเลย ไม่มีการวนลูบ (ใช้ recursion แทน)
ซึ่งแนวคิดก็ต้องเน้นสร้างฟังก์ชั่นนั่นแหละ แต่หลักสำคัญต้องออกแบบให้หลีกเลี่ยง side-effect (ผลข้างเคียง) ที่จะเกิดต่อ function ตัวเอง และตัวอื่น โดยมีหลักยึด 2 อย่างใหญ่คือ
👉 1) function ที่สร้างขึ้นมา เมื่อมีอินพุตค่าเดิมส่งไปหา (เป็นค่าอากิวเมนต์) ไม่ว่าจะกี่ครั้งก็ตาม function จะรีเทิร์นค่าออกมาเหมือนเดิมทุกครั้ง ...(ไอเดียมาจากฟังก์ชั่นในทางคณิตศาสตร์เลยครับ)
เช่น
func(1); // เรียกครั้งที่ 1 ก็จะได้ค่ารีเทิร์นออกมาเป็น 30
func(1); // เรียกครั้งที่ 2 ก็จะได้ค่ารีเทิร์นออกมาเป็น 30 เหมือนเดิม
func(1); // เรียกครั้งที่ 3 ก็จะได้ค่ารีเทิร์นออกมาเป็น 30 เหมือนเดิม
👉 2) function ต้องไม่ไปเปลี่ยนแปลงค่าของตัวแปรจำพวก global variable หรือ static variable หรือตัวแปรที่อยู่ข้างนอก function ...เพื่อไม่ให้ function อื่นได้รับผลกระทบ
ถ้า function ที่เราประกาศไว้ มีคุณสมบัติ 2 อย่างที่ว่านี้ ก็จะเรียกว่า pure function (ฟังก์ชั่นบริสุทธ์แท้ๆ) 👌
สำหรับอีกคุณลักษณะหนึ่งที่จะไม่กล่าวถึงไม่ได้เลยก็คือ
👉 3) First-class function และ Higher-order function
คำว่า first-class function มาจาก "first class citizen" ที่หมายถึง "พลเมืองชั้นหนึ่ง" ดังนั้น first-class function จะหมายถึง ฟังก์ชั่นเป็นพลเมืองชั้นหนึ่งจริงๆ เลยนะ
คุณสมบัตินี้ function จะถูกมองเป็นข้อมูลประเภทหนึ่ง ไม่ต่างจากข้อมูลตัวเลข สตริง บูลีน ด้วยเหตุนี้จึงสามารถนำ function ไปกำหนดค่าให้กับตัวแปรยังได้เลย เช่น
x = function(){ .....}
ส่วนคุณสมบัติ Higher-order function:
คุณสมบัตินี้หมายถึง เราสามารถใช้ function ส่งไปเป็นค่าอากิวเมนต์แก่ function ตัวอื่น หรือ function จะรีเทิร์นออกมาจาก function ตัวอื่นออกมาก็ได้ด้วย เช่น
- ส่ง function_A เป็นค่าอากิวเมนต์ไปให้ function_X(function_A);
- จากนั้น function_X() ก็จะสร้าง function_Y แล้วรีเทิร์นมันออกมาได้
😜 ===ประโยชน์ functional programming===
🔥 เอาไปเขียนโปรแกรมโดยไม่มีการวนลูป เช่น ไม่ต้องมานั่งเขียน for … หรือ while… วนลูป เพื่อเข้าถึงข้อมูลโครงสร้างพวก array , list ฯลฯ เป็นต้น
🔥 การทำ currying หมายถึงทำให้ฟังก์ชั่น จากเดิมที่มี parameter หลายตัวให้เหลือแค่ตัวเดียว ด้วยการส่งผลลัพธ์เป็น function ที่รับ Parameter ที่เหลือ ...ใช้เทคนิค closure
🔥 หรือจะทำ function Composition (เอาฟังก์ชั่นมาประกอบกัน)
🔥 หรือจะเอาไปใช้เขียนโปรแกรมแบบ parallel computing (โปรแกรมคู่ขนาน)
🔥 หรือจะเขียนโปรแกรมแบบ asynchronous โดยที่โค้ดหลักไม่ต้องรอการประมวลผลฝั่ง I/O ให้แล้วเสร็จ โค้ดหลักสามารถข้ามไปยังบรรทัดถัดไปก่อนได้เลย
🔥 Testability — ผลพลอยได้ก็คือ เอาแนวคิดนี้ไปใช้ทำ test function ได้ง่าย โดยแต่ละการ test จะเป็นอิสระต่อกัน เมื่อใช้วิธีการเดิมในการทดสอบ 10 ครั้ง ก็ควรได้ผลเหมือนเดิม 10 ครั้ง เป็นต้น
++++ 🤔 ++++++
เมื่อเปรียบเทียบกับแนวคิด OOP (โปรแกรมเชิงวัตถุ object-oriented programming)
ถ้าโจทย์ปัญหาเป็น parallel computing หรือ asynchronous การใช้แนวคิด functional programming ดูแล้วคล่องแคล่วปราดเปรียวไม่ยุ่งยาก
เนื่องจากแนวคิด functional programming ไม่มีอะไรซับซ้อนมากนัก เขียนโปรแกรมก็จะกระชับ ง่าย...ง๊าย เมื่อเทียบกับ OOP ที่โค้ดจะเยอะกว่า เพราะมี class มากมาย ยิ่งถ้า inheritance โดยให้มีการสืบทอดสมาชิกหลายชั้น ก็จะสับสนตาลาย มึนงงได้ คงต้องพึ่ง IDE ให้เป็นพี่เลี้ยงช่วยแนะนำว่ามีสมาชิกอะไรที่สืบทอดมา
แต่จุดเด่นเรื่อง OOP จะมีความเป็น Modularity ที่สูง โค้ดที่เขียนเป็นอ็อบเจ็กต์แต่ละตัวจะเป็นอิสระต่อกัน เนื่องจากข้อมูลหรือ state ซึ่งอยู่ภายในตัวอ็อบเจ็กต์เอง จะมีเป็นของใครของมัน ขณะเดียวกันแต่ละอ็อบเจ็กต์จะปฏิสัมพันธ์กันได้ สามารถเอาอ็อบเจ็กต์ที่มีอยู่แล้วมา reuse ใช้ได้ง่าย รวมทั้งถอดเข้าถอดออกขณะโปรแกรม run time
แล้วแต่สถานการณ์ว่าจะใช้แนวทางเขียนโปรแกรมแบบไหน
แต่ก็ยอมรับว่าบางทีเขียนแบบ functional programming ก็ยากต่อการทำความเข้าใจ เพราะโค้ดมันสั้นกระชับเกิ๊น
ยิ่งหลายภาษาโปรแกรมมิ่งสมัยใหม่ในปัจจุบันนี้ มีการแทรกแนวคิด functional programming เข้ามา นอกเหนือจากแนวคิด OOP เช่น JavaScript, Python, Java, C#, Swift, Kotlin แต่ก็อาจประยุกต์แนวคิดนี้ได้ไม่ 100% มากนัก
จะไม่เหมือนบ้างภาษาเช่น Haskell ที่มาพร้อมกับ immutable data structure หมายถึงข้อมูลที่ไม่สามารถแก้ไขค่าได้เลย จึงทำให้ function กลายเป็น functional programming แท้ๆ (pure function)
✍ สรุป แนวคิดนี้ไม่ได้เรื่องใหม่มีมานานก่อนบางคน ...อุ้แว ...อุ้แวเกิดเสียอีก แต่ตอนโน่นแนวคิดนี้ยังไม่ดังเปรี้ยงเหมือน OOP คนที่เขียนภาษา JavaScript รวมไปถึง Node.js ย่อมใช้หลักการนี้อย่างไม่รู้ตัว ยิ่งภาษาสมัยใหม่หลายตัวก็ยอมรับแนวคิด functional programming เข้ามาในภาษาเรียบร้อยแล้ว ไม่มีนี้ถือว่าแปลกมาก
--------
เขียนโดย โปรแกรมเมอร์ไทย thai programmer
python recursion 在 โปรแกรมเมอร์ไทย Thai programmer Facebook 八卦
Functional programming ชื่อไทยคือ “การโปรแกรมเชิงฟังก์ชั่น” ชื่อย่อ FP เป็นแนวคิดหนึ่งของการเขียนโปรแกรม (programming paradigm) ชื่อขึ้นต้นด้วย functional แต่ไม่ได้มีดีแค่ประกาศ function ปุ๊บเสร็จ แล้วเรียกใช้ มันมีเบื้องลึกมากกว่านั้นแน่ๆ
🤔 มันจะต่างจากการเขียนโปรแกรมทีละสเตป ตามลำดับก่อนหลัง มีการวนลูป ที่เน้นแก้ state ของโปรแกรมเป็นหลัก
แต่แนวทาง functional programming จะไม่แก้ state ของโปรแกรมเลย ไม่มีการวนลูบ (ใช้ recursion แทน)
ซึ่งแนวคิดก็ต้องเน้นสร้างฟังก์ชั่นนั่นแหละ แต่หลักสำคัญต้องออกแบบให้หลีกเลี่ยง side-effect (ผลข้างเคียง) ที่จะเกิดต่อ function ตัวเอง และตัวอื่น โดยมีหลักยึด 2 อย่างใหญ่คือ
👉 1) function ที่สร้างขึ้นมา เมื่อมีอินพุตค่าเดิมส่งไปหา (เป็นค่าอากิวเมนต์) ไม่ว่าจะกี่ครั้งก็ตาม function จะรีเทิร์นค่าออกมาเหมือนเดิมทุกครั้ง ...(ไอเดียมาจากฟังก์ชั่นในทางคณิตศาสตร์เลยครับ)
เช่น
func(1); // เรียกครั้งที่ 1 ก็จะได้ค่ารีเทิร์นออกมาเป็น 30
func(1); // เรียกครั้งที่ 2 ก็จะได้ค่ารีเทิร์นออกมาเป็น 30 เหมือนเดิม
func(1); // เรียกครั้งที่ 3 ก็จะได้ค่ารีเทิร์นออกมาเป็น 30 เหมือนเดิม
👉 2) function ต้องไม่ไปเปลี่ยนแปลงค่าของตัวแปรจำพวก global variable หรือ static variable หรือตัวแปรที่อยู่ข้างนอก function ...เพื่อไม่ให้ function อื่นได้รับผลกระทบ
ถ้า function ที่เราประกาศไว้ มีคุณสมบัติ 2 อย่างที่ว่านี้ ก็จะเรียกว่า pure function (ฟังก์ชั่นบริสุทธ์แท้ๆ) 👌
สำหรับอีกคุณลักษณะหนึ่งที่จะไม่กล่าวถึงไม่ได้เลยก็คือ
👉 3) First-class function และ Higher-order function
คำว่า first-class function มาจาก "first class citizen" ที่หมายถึง "พลเมืองชั้นหนึ่ง" ดังนั้น first-class function จะหมายถึง ฟังก์ชั่นเป็นพลเมืองชั้นหนึ่งจริงๆ เลยนะ
คุณสมบัตินี้ function จะถูกมองเป็นข้อมูลประเภทหนึ่ง ไม่ต่างจากข้อมูลตัวเลข สตริง บูลีน ด้วยเหตุนี้จึงสามารถนำ function ไปกำหนดค่าให้กับตัวแปรยังได้เลย เช่น
x = function(){ .....}
ส่วนคุณสมบัติ Higher-order function:
คุณสมบัตินี้หมายถึง เราสามารถใช้ function ส่งไปเป็นค่าอากิวเมนต์แก่ function ตัวอื่น หรือ function จะรีเทิร์นออกมาจาก function ตัวอื่นออกมาก็ได้ด้วย เช่น
- ส่ง function_A เป็นค่าอากิวเมนต์ไปให้ function_X(function_A);
- จากนั้น function_X() ก็จะสร้าง function_Y แล้วรีเทิร์นมันออกมาได้
😜 ===ประโยชน์ functional programming===
🔥 เอาไปเขียนโปรแกรมโดยไม่มีการวนลูป เช่น ไม่ต้องมานั่งเขียน for … หรือ while… วนลูป เพื่อเข้าถึงข้อมูลโครงสร้างพวก array , list ฯลฯ เป็นต้น
🔥 การทำ currying หมายถึงทำให้ฟังก์ชั่น จากเดิมที่มี parameter หลายตัวให้เหลือแค่ตัวเดียว ด้วยการส่งผลลัพธ์เป็น function ที่รับ Parameter ที่เหลือ ...ใช้เทคนิค closure
🔥 หรือจะทำ function Composition (เอาฟังก์ชั่นมาประกอบกัน)
🔥 หรือจะเอาไปใช้เขียนโปรแกรมแบบ parallel computing (โปรแกรมคู่ขนาน)
🔥 หรือจะเขียนโปรแกรมแบบ asynchronous โดยที่โค้ดหลักไม่ต้องรอการประมวลผลฝั่ง I/O ให้แล้วเสร็จ โค้ดหลักสามารถข้ามไปยังบรรทัดถัดไปก่อนได้เลย
🔥 Testability — ผลพลอยได้ก็คือ เอาแนวคิดนี้ไปใช้ทำ test function ได้ง่าย โดยแต่ละการ test จะเป็นอิสระต่อกัน เมื่อใช้วิธีการเดิมในการทดสอบ 10 ครั้ง ก็ควรได้ผลเหมือนเดิม 10 ครั้ง เป็นต้น
++++ 🤔 ++++++
เมื่อเปรียบเทียบกับแนวคิด OOP (โปรแกรมเชิงวัตถุ object-oriented programming)
ถ้าโจทย์ปัญหาเป็น parallel computing หรือ asynchronous การใช้แนวคิด functional programming ดูแล้วคล่องแคล่วปราดเปรียวไม่ยุ่งยาก
เนื่องจากแนวคิด functional programming ไม่มีอะไรซับซ้อนมากนัก เขียนโปรแกรมก็จะกระชับ ง่าย...ง๊าย เมื่อเทียบกับ OOP ที่โค้ดจะเยอะกว่า เพราะมี class มากมาย ยิ่งถ้า inheritance โดยให้มีการสืบทอดสมาชิกหลายชั้น ก็จะสับสนตาลาย มึนงงได้ คงต้องพึ่ง IDE ให้เป็นพี่เลี้ยงช่วยแนะนำว่ามีสมาชิกอะไรที่สืบทอดมา
แต่จุดเด่นเรื่อง OOP จะมีความเป็น Modularity ที่สูง โค้ดที่เขียนเป็นอ็อบเจ็กต์แต่ละตัวจะเป็นอิสระต่อกัน เนื่องจากข้อมูลหรือ state ซึ่งอยู่ภายในตัวอ็อบเจ็กต์เอง จะมีเป็นของใครของมัน ขณะเดียวกันแต่ละอ็อบเจ็กต์จะปฏิสัมพันธ์กันได้ สามารถเอาอ็อบเจ็กต์ที่มีอยู่แล้วมา reuse ใช้ได้ง่าย รวมทั้งถอดเข้าถอดออกขณะโปรแกรม run time
แล้วแต่สถานการณ์ว่าจะใช้แนวทางเขียนโปรแกรมแบบไหน
แต่ก็ยอมรับว่าบางทีเขียนแบบ functional programming ก็ยากต่อการทำความเข้าใจ เพราะโค้ดมันสั้นกระชับเกิ๊น
ยิ่งหลายภาษาโปรแกรมมิ่งสมัยใหม่ในปัจจุบันนี้ มีการแทรกแนวคิด functional programming เข้ามา นอกเหนือจากแนวคิด OOP เช่น JavaScript, Python, Java, C#, Swift, Kotlin แต่ก็อาจประยุกต์แนวคิดนี้ได้ไม่ 100% มากนัก
จะไม่เหมือนบ้างภาษาเช่น Haskell ที่มาพร้อมกับ immutable data structure หมายถึงข้อมูลที่ไม่สามารถแก้ไขค่าได้เลย จึงทำให้ function กลายเป็น functional programming แท้ๆ (pure function)
✍ สรุป แนวคิดนี้ไม่ได้เรื่องใหม่มีมานานก่อนบางคน ...อุ้แว ...อุ้แวเกิดเสียอีก แต่ตอนโน่นแนวคิดนี้ยังไม่ดังเปรี้ยงเหมือน OOP คนที่เขียนภาษา JavaScript รวมไปถึง Node.js ย่อมใช้หลักการนี้อย่างไม่รู้ตัว ยิ่งภาษาสมัยใหม่หลายตัวก็ยอมรับแนวคิด functional programming เข้ามาในภาษาเรียบร้อยแล้ว ไม่มีนี้ถือว่าแปลกมาก
--------
เขียนโดย โปรแกรมเมอร์ไทย thai programmer
python recursion 在 蕭瑟寡人 Facebook 八卦
【台灣的軟體工程師都跑哪裡去了?】
台灣的軟體工程師都跑哪裡去了?這是一個困擾我很多年的問題。台灣有那麼多的資訊相關科系,每年有那麼多的畢業生,但是我們公司要找軟體工程師的時候,卻總覺得很難找。我原本以為是我們公司小,所以有些軟體工程師不願意來上班,但是我問了一些在大型軟體公司工作的老闆或是高階研發主管,他們也是一直在抱怨,說很難找到好的軟體工程師。我們只是依稀的知道,有很多的軟體工程師跑到硬體公司上班去了,但究竟為什麼會這樣?我一直搞不懂,而我的那些軟體業的朋友們也搞不懂。
直到最近,我為了找軟體工程師到我們公司開發機器學習相關產品,才突然對這件事情有了更深一層的領悟。
最近機器學習 (Machine Learning) 這個議題實在太紅了,所以我就像大部分的公司老闆一樣,心裡有很強的焦慮感。我原本打算用高薪僱用一個熟悉這個領域的工程師,先來研究如何將機器學習技術應用在我們的產品上面。結果我問了一些專家,他們都說這個領域最近的發展很快,資深工程師往往反而不了解,所以要找就乾脆找一些剛畢業的、在學校學過機器學習相關課程的資訊系畢業生。
但是我們公司的在網路上刊登的求才訊息放了一個多月,一直都沒有什麼好手來應徵。我又去問了一些朋友,才知道機器學習這個議題真的實在太紅了,所以大部分剛畢業的好手都被硬體公司用高薪網羅了。
於是我就開始在網路上找資料,自己研究機器學習技術。結果我研讀了一、兩個禮拜,發覺這個領域雖然在最近有著長足的進步,但基本原理跟二、三十年前沒有什麼大改變,像是Neural Net、Convolution、Recursion、Machine Learning等等,都是我以前就很熟悉的技術與概念,感覺上就像是跟二、三十年前認識的老朋友重逢一樣,非常的親切。
於是我轉念一想,既然這些基本觀念我都懂,只是不熟悉一些新的機器學習開發工具而已,那我為什麼不花個五十萬台幣外包,請幾個資訊系在學的大學生或是研究所學生,花兩、三個月幫我們把開發環境架設起來,然後再由我們公司現有的資深軟體工程師接手就好了?而對接這個外包案的學生們來說,五十萬台幣也許是一筆大錢,但對我們公司來說,這比起我們自己花一百萬年薪請個菜鳥工程師來做開發,至少可以省五十萬台幣以上。
但想來機器學習真的是太紅了,所以過了一兩個禮拜,我們開價五十萬台幣要找人外包的事情也還是沒有進展,一直沒有辦法找到合適的人選。萬般無奈之下,我只好自己買了一本書,嘗試自己架設做機器學習產品開發所需要的軟體開發環境,像是Python,TensorFow, Keras 等等。
沒想到,我自己花不到兩個小時的時間,就很順利的把這些開發環境架設起來了。而我自己用一些零散的時間寫一些程式,居然也在兩個禮拜內取得了不少進展,至少,我們已經證明了我們原先的產品設想是可行的。
我心中得意非凡,不但在實驗上得到了很多的樂趣與成就感,同時也覺得又省下了五十萬台幣。
所以仔細想想,一個剛畢業的資訊相關科系學生,到硬體公司上班一定比來我們公司上班幸福多了。台灣大多數的硬體公司都很有錢,花得起高薪請工程師。而硬體公司的老闆通常每隔幾年就要像發燒一樣,決定大舉投資軟體業,同時接受媒體訪問,說台灣的未來在軟體,不在硬體。然後他們在網際網路剛興起的時候投資網際網路軟體公司,在APP當紅的時候轉投資APP軟體公司,在雲端運算紅的的時候轉投資雲端運算軟體,在大數據當紅的時候轉投資大數據軟體公司,而現在 AI 機器學習正紅,他們當然也要轉投資 AI 機器學習的軟體公司。
軟體工程師在大型硬體公司的軟體部門或是轉投資軟體公司工作,即使位階不高,也經常會有機會跟郭台銘、施振榮、林百里、施崇棠這種國際巨星等級的大老闆開會。在會議中隨便亂講也不會有事,因為那些硬體大老闆們通常不會懂這些軟體工程到底是在講什麼,他們只能不斷的點頭微笑,然後轉頭跟媒體記者們說,就是因為他們不懂軟體,所以更要給這些軟體工程師很大的創新與犯錯的空間。
而軟體工程師到我們這樣的中小型軟體公司上班,就只能跟我這種名不見經傳的老闆一起開會,而且對於技術的事情不能亂講。如果亂講,就算我能忍住不罵人,也很難忍住不發笑。
硬體公司的大老闆通常對軟體工程師很大方,他們給高薪,通常還會覺得很划算,因為這些軟體工程師帶來了一些他們公司原本沒有的技術,感覺上就是很厲害,邊際效益很高;而軟體公司的老闆通常對軟體工程師比較小氣,他們給薪水,通常都還要考慮軟體工程師本身的能力,他們只願意給有能力的軟體工程師高薪,而不願意給平庸的工程師高薪。
軟體工程師到硬體公司上班,就像是台灣的演員參與美國好萊塢年度大片的拍攝一樣,不但薪水高,而且就算只是擔任個小配角或臨時演員、戲份不重,也會有機會跟國際巨星說上幾句話。就算他們的演技不好,國外的觀眾也會以為華人講話的表情天生就是這樣。
而軟體工程師到軟體公司工作,就像是台灣的演員在本土連續劇中演戲一樣,就算演的是主角還是第一男配角,也沒有什麼好向親朋好友炫耀的。而如果在戲中台語發音不標準,馬上就會被導演跟觀眾罵。
當然,雖然台灣的大型硬體公司在過去三十年來不斷的投資各種軟體事業,但他們好像也從來沒有做出過什麼偉大的軟體產品,也沒有拆分出什麼偉大的軟體公司。硬體大老闆們的軟體熱,通常過了幾年就自然退燒了。現在他們早已經忘了那些關於網際網路、APP軟體的投資,而對於雲端運算與大數據好像也沒有那麼熱衷了。
於是那些到大型硬體公司上班的軟體工程師,通常在五年、十年之後就會失寵,然後就會出來找軟體公司的工作,但是他們往往期望很高的薪水,卻只能做一些很基本的軟體開發工作,他們在硬體公司工作的那些年,軟體技術往往沒有什麼長進,甚至可能退步了。而原來他們所熟悉擅長的先進技術,通常也退流行了。
找那些在大型硬體公司工作多年的軟體工程師到軟體公司工作,就像是找那些在好萊塢大片中當過臨時演員的華人回來演本土劇一樣,總會覺得哪裡怪怪的。
所以說,一切都是非常合理的。台灣許多的軟體公司找不到合適的年輕工程師,而台灣許多的軟體工程師在中年之後遇到職涯瓶頸,這都是非常合理,而且可以解釋的。
只是在這所有合理的現象之下,我還是找不到有能力的年輕軟體工程師來幫我們公司開發機器學習相關產品,我還是必須跟幾個現有的資深工程師自己搞。
這實在很不合理啊。
python recursion 在 Python 初學第八講— 遞迴. 遞迴Recursion - Medium 的相關結果
實作recursion 函式. 以下我們將討論三個經典的遞迴問題,階乘、費氏數列以及最大公因數。 階乘Factorial. ... <看更多>
python recursion 在 Recursion in Python: An Introduction - Real Python 的相關結果
If you're familiar with functions in Python, then you know that it's quite common for one function to call another. In Python, it's also ... ... <看更多>
python recursion 在 Python Recursive Function - Programiz 的相關結果
Python Recursive Function ... In Python, we know that a function can call other functions. It is even possible for the function to call itself. These types of ... ... <看更多>