1、问题描述
杨辉三角形
输出以下的杨辉三角形(要求输出10行)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
……………………
2、我对这问题的看法
在我看来,本题考察的主要是组合数的计算,即
的计算,具体的计算方法下面会详细的介绍。在计算完组合数后,对组合数进行输出操作即可。
3、解法思想
(1)首先,写实现求组合数的函数comm(),具体的代码思想和代码在下面有详细说明;
(2)接着,写输出函数output(),在函数里通过两个for循环控制输出的行数以及每行输出的个数;大for循环控制输出的行数,小for循环控制每行输出的个数(在这个for循环中调用comm()函数,具体的调用形式为comm(i,j),即求
);
(3)最后,写主函数main(),在main函数中调用output函数即可;
4、组合数
的计算
计算公式:
=
+
由上述的公式不难看出,
的值可以通过
与
的和表示,故可以通过递归的方法,不断地递推,最终得到
的值。
具体的实现代码(递归算法)
int comm(int n,int k) //计算组合数
{
if(k>n) return 0; //若k>n,报错;
else if(k==n||k==0) return 1; //若k=n或k=0,返回1,即函数结束;
else return comm(n-1,k)+comm(n-1,k-1); //开始递归;
}
代码运行截图
计算
为例:
5、完整解法代码
#include<iostream>
using namespace std;
int comm(int n,int k) //计算组合数;
{
if(k>n) return 0; //若k>n,报错;
else if(k==n||k==0) return 1; //若k=n或k=0,返回1,即函数结束;
else return comm(n-1,k)+comm(n-1,k-1); //开始递归;
}
void output(int lineNumber) //定义输出函数output(),并定义存放输出行数的变量lineNumber;
{
for(int i=0;i<lineNumber;i++) //变量i控制输出的行数;
{
for(int j=0;j<=i;j++) //变量j控制每行输出的个数;
{
cout<<comm(i,j)<<" "; //调用函数comm();
}
if(i!=lineNumber-1) //保证最后一行不换行;
{
cout<<endl; //一行输出结束后换行;
}
}
}
int main()
{
output(10);
return 0;
}
6、运行截图
输出10行:
至此,整个题目解答完毕!!!
结语:以上就是我对这个问题的理解、解法,可能存在着更好、更简洁的解法代码,希望大家提出来,我们一起讨论,交换看法,共同进步。若上述代码中存在问题,望大家指正,谢谢大家看到结尾。(∩^∩)
奋斗的2351