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