杨辉三角形,又称贾宪三角形、帕斯卡三角形、海亚姆三角形,是二项式系数在的一种写法,形似三角形,在中国首现于南宋杨辉的《详解九章算术》得名,书中杨辉说明是引自贾宪的《释锁算术》,故又名贾宪三角形。
前9层写出来如下:
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
递归法
首先给大家介绍一种最简单的求杨辉三角mn值的方法(m为行,n为列,比如(5,3)即为第五行第三个,值为6)即为递归法:
function recursion($m, $n) {
if ($n == 1 || $n == $m || $m == 1) {
return 1;
}
$val = recursion($m-1, $n - 1) + recursion($m-1, $n);
return $val;
}
这种方法实现最简单,但是如果mn的值特别大的话,性能会非常差,我试了个100,78,就把机器卡死了。。
迭代法
迭代法从第一层开始循环,只循环每行中必要的列,最后求出mn位置的值。代码如下:
function setNum($row, $list)
{
$arr = array();
for ($i = 0; $i < $row; $i++) {
$start = ($list - ($row - $i)) < 0 ? 0 : ($list - ($row - $i));
$end = ($list - 1) > $i ? $i : ($list - 1);
for ($j = $start; $j <= $end; $j++) {
if ($i == 0 || $i == 1 || $j == 0 || $i == $j) {
$arr[$i][$j] = 1;
} else {
$arr[$i][$j] = $arr[$i - 1][$j] + $arr[$i - 1][$j - 1];
}
}
}
return $arr[--$row][--$list];
}
公式法
当然了,根据杨辉三角的性质:第n行的m个数可表示为 C(n-1,m-1),用排列组合的公式也可以获得mn的值,代码如下:
function express($m, $n) {
$up = 1;
for ($i = $m - 1; $i > ($m - $n); $i--) {
$up *= $i;
}
$down = 1;
for ($i = $n - 1; $i > 0; $i--) {
$down *= $i;
}
return $up / $down;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。