杨辉三角的历史
在平武等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计制作、成都网站制作 网站设计制作按需定制开发,公司网站建设,企业网站建设,品牌网站设计,全网营销推广,外贸营销网站建设,平武网站建设费用合理。
杨辉三角按照杨辉于1261年所编写的《详解九章算法》一书,里面有一张图片,介绍此种算法来自于另外一个数学家贾宪所编写的《释锁算书》一书,但这本书早已失传无从考证。但可以肯定的是这一图形的发现我国不迟于1200年左右。在欧洲,这图形称为"巴斯加(Pascal)三角"。因为一般都认为这是巴斯加在1654年发明的。其实在巴斯加之前已经有许多人普及过,最早是德国人阿匹纳斯(Pertrus APianus),他曾经把这个图形刻在1527年著的一本算术书封面上。但无论如何,杨辉三角的发现,在我国比在欧洲至少要早300年光景。
此外杨辉三角原来的名字也不是三角,而是叫做开方作法本源,后来也有人称为乘法求廉图。因为这些名称实在太古奥了些,所以后来简称为“三角”。
在小傅哥学习杨辉三角的过程中,找到了一本大数学家华罗庚的PDF《从杨辉三角谈起 - 华罗庚》。—— 这些数学真的非常重要,每每映射到程序中都是一段把for循环优化成算法的体现,提高执行效率。
在开始分享杨辉三角的特性和代码实现前,我们先来了解下杨辉三角的结构构造。
杨辉三角的结构和规律非常简单,除去每次两边的1,中间的数字都是上面两个数字的和。如图示意的三角区域。但也就是如此简单的结构,却有着诸多的数学逻辑体现。包括我们计算的二项式、N选X的种数还有斐波那契数列等,都可以在杨辉三角中体现出来。接下来我们就来看看这些特性。
为了方便学习杨辉三角的数学逻辑特性,我们把它按左对齐方式进行排列。
[1]
[1,1]
[1,2,1]
[1,3,3,1]
[1,4,6,4,1]
[1,5,10,10,5,1]
[1,6,15,20,15,6,1]
[1,7,21,35,35,21,7,1]
[1,8,28,56,70,56,28,8,1]
接下来我们就以这组杨辉三角数列,来展示它的数学逻辑特性。关于杨辉三角的Java代码放已到下文中,读者可以查阅。
大家在上学阶段一定学习过二项式展开,例如:(x+y)^2 = x^2 + 2xy + y^2 其实这个展开的数学逻辑在杨辉三角中可以非常好的展示出来。
组合数是数学中定义的一种数学概念,用于计算有多少种选择可以从一组物品中选择出若干的物品。比如你早上有5种水果可以吃,但你吃不了那么多,让你5种水果中选2个,看看有多少种选择。通过使用公式 c(n,k) = n!/k!(n-k)! 可以计算出,5选2有10种选择。
那么这样一个计算也是可以体现在杨辉三角中的。
斐波那契数列出现在印度数学中,与梵文韵律有关。在梵语诗歌传统中,人们对列举所有持续时间为 2 单位的长 (L) 音节与 1 单位持续时间的短 (S) 音节并列的模式很感兴趣。关于更多斐波那契更多知识可以阅读小傅哥的:《程序员数学:斐波那契》—— 为什么不能用斐波那契散列,做数据库路由算法?
斐波那契数列可以由递归关系定义:F0 = 0,F1 = 1,Fn = Fn-1 + Fn-2
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 0 1 1 2 3 5 8 13 21 34
而这样一个有规律的斐波那契数列在杨辉三角中也是有所体现的。
在杨辉三角中还有一个非常有意思的特性,就是有2的次方和11次方数。
2次方
- 杨辉三角每一行的数字加和,正好的2的0次方、1次方..n次方
11次方
接下来我们实现下杨辉三角;
public HashMappascalTriangle(int lineNumber) {
HashMapcurrentLine = new HashMap<>();
currentLine.put(0, 1);
int currentLineSize = lineNumber + 1;
for (int numberIdx = 1; numberIdx < currentLineSize; numberIdx += 1) {
/*
* https://git***.com/trekhleb/javascript-algorithms/blob/master/src/algorithms/math/pascal-triangle/pascalTriangle.js
* 第i行号中的第 -th 个条目lineNumber是 Binomial CoefficientC(lineNumber, i)并且所有行都以 value 开头1。这个思路是C(lineNumber, i)使用C(lineNumber, i-1). 它可以O(1)使用以下方法及时计算:
* C(lineNumber, i) = lineNumber! / ((lineNumber - i)! * i!)
* C(lineNumber, i - 1) = lineNumber! / ((lineNumber - i + 1)! * (i - 1)!)
*
* 从以上两个表达式我们可以推导出下面的表达式:C(lineNumber, i) = C(lineNumber, i - 1) * (lineNumber - i + 1) / i
* 所以C(lineNumber, i)可以从C(lineNumber, i - 1)时间上算出来O(1)
*/
currentLine.put(numberIdx, ((null == currentLine.get(numberIdx - 1) ? 0 : currentLine.get(numberIdx - 1)) * (lineNumber - numberIdx + 1)) / numberIdx);
}
return currentLine;
}
单元测试
@Test
public void test_PascalTriangle() {
PascalTriangle pascalTriangle = new PascalTriangle();
for (int i = 0; i <= 10; i++) {
HashMapcurrentLineMap = pascalTriangle.pascalTriangle(i);
System.out.println(JSON.toJSONString(currentLineMap.values()));
}
}
[1]
[1,1]
[1,2,1]
[1,3,3,1]
[1,4,6,4,1]
[1,5,10,10,5,1]
[1,6,15,20,15,6,1]
[1,7,21,35,35,21,7,1]
[1,8,28,56,70,56,28,8,1]
[1,9,36,84,126,126,84,36,9,1]
[1,10,45,120,210,252,210,120,45,10,1]
本文题目:杨辉三角的五个特性,一个比一个牛皮!
网页链接:http://www.shufengxianlan.com/qtweb/news32/108882.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联