说明:
杨辉三角是我国数学史上的一个伟大成就,比帕斯卡早了393年。最早出现在贾宪的《黄帝九章算经细草》中,比帕斯卡早了600年。
——来自百度百科-杨辉三角
在这里探究了一下编程实现输出杨辉三角的方法。
基础要求:
- 能够使用
for
循环计算阶乘 - 能够使用数组
基础要求也就是本次学习会涉及到的内容,基础扎实者能够很好地理解下面的代码,如果没有也可以在这里学习到以上的内容
基本思路:
- 思路一:
由杨辉三角的直观规律可以引申出计算方法
- 思路二:
由杨辉三角和二项式系数的关系可以转换杨辉三角为求二项式系数的问题
代码实现:
思路一:
二维数组计算
假设输出10行杨辉三角,在这里声明了一个10*10的二维数组。
namespace 习题4_3._5
{
class Program
{
static void Main(string[] args)
/* 二维数组 */
int[,] num = new int[10, 10];
//初始化二维数组的元素为0
for (int m = 0; m < 10; m++)
{
//初始化每一行的第一个数为1
num[m, 0] = 1;
for (int n = 1; n < 10; n++)
num[m, n] = 0;
}
//输出第一行的数字
Console.WriteLine(num[0, 0]);
//
for (int row = 1; row < 10; row++)
{
//输出每一行的第一个数
Console.Write("{0}\t",num[row, 0]);
for (int col = 1; col <= row; col++)
{
num[row, col] = num[row - 1, col - 1] + num[row - 1, col];
Console.Write("{0}\t", num[row, col]);
}
Console.WriteLine("");
}
Console.ReadKey();
}
}
}
一维数组计算
一维的暂时还没有实现,对不起江中父老啊!
思路二:
使用阶乘计算二项式系数
namespace Binomial_coefficient {
class Program {
static void Main(string[] args)
{
for (int m = 0; m < 10; m++)
{
for (int n = 0; n <= m; n++)
{
//调用阶乘的方法计算 "m! / ((m - n)! * n!)"
Console.Write("{0}\t", factorial(m) / (factorial(n) * factorial(m - n)));
}
//换行
Console.WriteLine("");
}
Console.ReadKey();
}
//阶乘的方法
public static int factorial(int x)
{
int res = 1;
for (int i = 1; i <= x; i++)
res *= i;
return res;
}
}
}
二项式系数递归(据说是最优算法)
namespace 习题4_3._5
{
class Program
{
static void Main(string[] args)
{
int num = 1;
//输出第一行的"1"
Console.WriteLine("1");
//row <= 10 表示输出杨辉三角的10行
for (int row = 2; row <= 10; num = 1, row++)
{
//输出每一行开始的"1"
Console.Write("1\t");
for (int i = 1; i <= row - 2; i++)
{
//神奇的式子使用了递归的思想(二项式系数的递归),见解释
num = (row - i) / i * num;
Console.Write("{0}\t", num);
}
//输出每一行结束的"1"
Console.WriteLine("1");
}
Console.ReadKey();
}
}
}
神奇的式子的解释:
看图,我觉得一切都释然了
由于前面和最后的1都是靠输出的,所以图中只有左边括号括住的才是在第二个循环里面执行的。
在CSDN里面看到这样一句话
最没有用的是源码,最有用的算法和数据结构
,既然这样的话,只要知道实现杨辉三角的思想就好了,具体怎么实现牛不那么重要了。
这里有杨辉三角算法集锦有兴趣的研究一下。