算法--组合数学:杨辉三角数学分析以及Java实现
生活随笔
收集整理的這篇文章主要介紹了
算法--组合数学:杨辉三角数学分析以及Java实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.定義
楊輝三角,是二項式系數在三角形中的一種幾何排列。下圖為楊輝三角部分數據
2.楊輝三角規律
前提:每行端點與結尾的數為1
最重要的規律:
每個數字等于上一行的左右兩個數字之和。可用此性質寫出整個楊輝三角。即第n+1行的第i個數等于第n行的第i-1個數和第i個數之和,這也是組合數的性質之一。
C(n+1,i)=C(n,i)+C(n,i?1)
2.1 楊輝三角與11的冪的關系
假設y=11^n
當n=0時: y=1; 當n=1時: y=11; 當n=2時: y=121; 當n=3時: y=1331; 當n=4時: y=14641; ……2.2 楊輝三角與2的冪的關系
假設每一行的和為sum
則sum=2^(行數-1),如下:
2.3 楊輝三角與二項式定理展開式關系
二項式定理公式
二項式與楊輝三角的對應關系:
二項式定理與楊輝三角形是一對天然的數形趣遇,它把數形結合帶進了計算數學。求二項式展開式系數的問題,實際上是一種組合數的計算問題。
- 用系數通項公式來計算,稱為“式算”;
- 用楊輝三角形來計算,稱作“圖算”
3. 楊輝三角的應用
最經典的應用是小時候玩的彈球游戲,這種題目類再高中學習概率時,大家肯定都遇到過。
彈球游戲
小球向容器內跌落,碰到第一層擋物后向兩側跌落碰到第二層阻擋物,再向兩側跌落第三層阻擋物,如此一直下跌最終小球落入底層。根據具體地區獲的相應的獎品(AG區獎品最好,BF區獎品次之,CE區獎品第三,D 區獎品差)。
4. Java代碼實現楊輝三角
4.1 邏輯分析(用數組):
- 1)既然知道楊輝三角的規律:從第三行開始中間數是上一行斜對角的兩數之和
- 2)那么我只需要想辦法存錯上一行的數據即可,用于計算下一行中間的數值
- 3)因為從第三行才開始出現上述規律,所以我們需要首先要存儲第二行的數據,即k=2 - - k為存儲上一行數據的數組(若為集合就不需要考慮長度變化的問題了)
4)每一行的長度都在變化,所以k也需要變化,即k++
備注:這里使用的是數組,使用集合會更簡單
4.2 打印結果為直角三角形時
4.3 實現代碼
package 楊輝三角;/** 目的:Java代碼實現楊輝三角* * 邏輯分析(用數組):* 1)既然知道楊輝三角的規律:從第三行開始中間數是上一行斜對角的兩數之和* 2)那么我只需要想辦法存錯上一行的數據即可,用于計算下一行中間的數值* 3)因為從第三行才開始出現上述規律,所以我們需要首先要存儲第二行的數據,即k=2----k為存儲上一行數據的數組(若為集合就不需要考慮長度變化的問題了)* 4)每一行的長度都在變化,所以k也需要變化,即k++* * 備注:這里使用的是數組,使用集合會更簡單*/ public class Test1 {public static void main(String[] args) {//1.創建存儲上一行數據的數組tempint k = 2;int[] temp = new int[k];//1.1 因為兩端數均為1,所以給第一個數temp[0]和最后一個數temp[k-1]賦值為1temp[0] = temp[k - 1] = 1;//2.打印楊輝三角//打印的行數--即楊輝三角行數rowCountint rowCount = 12;for (int i = 1; i <= rowCount; i++) {// 建立數組,存取當前行數據int[] arr = new int[i];// 給當前行數組賦值for (int j = 0; j < i; j++) {// 先給第一個和最后一個數賦值if (j == 0 || j == i - 1) {arr[j] = 1;} else {// 中間數為上一行斜對角的兩數之和arr[j] = temp[j - 1] + temp[j];}}// 給當前行賦值完畢后讓k+1,增加數組長度,用于存取當前行的數據k++;temp = new int[k];// 打印當前行數組,并給新temp賦值,便于下一行使用當前行數據for (int y = 0; y < arr.length; y++) {temp[y] = arr[y];System.out.print(arr[y] + " ");}System.out.println();}} }4.4 以下內容僅供參考,可以不看
若想打印為等腰三角形,添加一個打印空格效果即可
for(int z=0;z<rowCount-i;z++){System.out.print(" ");}完整代碼
package 楊輝三角;public class Test1 {public static void main(String[] args) {//1.創建存儲上一行數據的數組tempint k = 2;int[] temp = new int[k];//1.1 因為兩端數均為1,所以給第一個數temp[0]和最后一個數temp[k-1]賦值為1temp[0] = temp[k - 1] = 1;//2.打印楊輝三角//打印的行數--即楊輝三角行數rowCountint rowCount = 8;for (int i = 1; i <= rowCount; i++) {// 建立數組,存取當前行數據int[] arr = new int[i];// 給當前行數組賦值for (int j = 0; j < i; j++) {// 先給第一個和最后一個數賦值if (j == 0 || j == i - 1) {arr[j] = 1;} else {// 中間數為上一行斜對角的兩數之和arr[j] = temp[j - 1] + temp[j];}}// 給當前行賦值完畢后讓k+1,增加數組長度,用于存取當前行的數據k++;temp = new int[k];//打印空格來實現等腰三角形 for(int z=0;z<rowCount-i;z++){System.out.print(" ");}// 打印當前行數組,并給新temp賦值,便于下一行使用當前行數據for (int y = 0; y < arr.length; y++) {temp[y] = arr[y];System.out.print(arr[y] + " ");}System.out.println();}} }結果:
總結
以上是生活随笔為你收集整理的算法--组合数学:杨辉三角数学分析以及Java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工具--Eclipse/MarkDown
- 下一篇: 算法--06年华为面试:求两个数组的最小