排列組合一直是許多人在高中數學的噩夢之一,我相信許多人現在對「庭院深深深幾許」這個句子都會會心一笑。那你有沒有想過,當時棘手的公式要如何用程式碼實現呢?
今天就用一個簡單的方法讓大家看看如何簡單的實現階層與排列組合!
階層(fraction):概念與實踐
階層的概念很單純,n! = n * (n-1) * (n-2)…. * 1
也就是一個數不斷乘以一個比自己小1的數字,直到最尾數為1,需要特別注意的是0!的值為1。
了解概念後我們便可以試著用以下方法實踐
方法一:while or for loop
function fraction(n){ let result = 1 while (n>0){ result*=n n-=1 } return result } console.log(fraction(0)) // 1 console.log(fraction(5)) // 120
方法二:遞迴
若你了解遞迴的概念,簡單說就是函數呼叫自身,那你可以用這樣方法實踐階層,會再更加簡潔一些。
function fraction(n){ if (n ===0){ return 1 } return n * fraction(n-1) } console.log(fraction(0)) // 1 console.log(fraction(5)) // 120
排列組合( Permutation ):概念與實踐
組合的概念就相對複雜一點點,數學原理我暫時不多說,但相信各位一定都隱約記得我們是用階層的概念去解排列組合的值,舉個例子來說吧!
C5取2我們可以拆成5!/(5-2)!*2!,最終變為5*4/2*1,得到10這個答案。
也就是說我們可以用三組階層來處理任何的C值! 到這邊相信各位應該就可以想出如何用剛剛的階層程式碼來實踐排列組合囉!
// function permutation (c,n){ return fraction(c)/(fraction(n)*fraction(c-n)) } console.log(permutation(5,2)) // 10 console.log(permutation(2,2)) // 1 console.log(permutation(10,3)) // 120
如何?輕鬆地就達成讓你傷透腦筋的排列組合吧!甚至不需要使用雙重迴圈呢!