写在前面:
我是一个小小的程序员,我的野心是成为一个全栈工程师!!!
正文:
这是我用来记录学习算法的一个系列。希望能与所有人共进步。
这是第三个特殊算法,也涉及到数学,递归。代码及解释如下:
/*******************************
**
** 算法:巴斯卡三角形(杨辉三角)
**
** 问题:
** 1
** 1 1
** 1 2 1
** 1 3 3 1
** 1 4 6 4 1
** ......
** 解决:据观察,
** 1.每个数等于它上方两数之和。
** 2.每行数字左右对称,由1开始逐渐变大。
** 3.第n行的数字有n项。
**
**
** 所以,设m为行数,n为列数,C(m,n)代表第m行的第n列的数值
** 则C(m,n) = C(m-1,n-1)+C(m-1,n),又是个递归
** m<2时,C(m,n) = 1
**
**
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("请输入你想得的位置的数值,示例:想得到第20行第10个数,则输入 20,10 回车即可\n");
int m,n; //分别记录行数和列数
scanf("%d,%d",&m,&n);
printf("第%d行第%d个数为:%d",m,n,C(m,n));
return 0;
}
/**
* 计算在某一位置上的数
* @param m int 行号
* @param n int 列号
*/
int C(int m,int n) {
int value = 0;
//因为第m行最多只有m个数,所以如果n大于m时,没有数,久返回0
if(m<n) {
value = 0;
}else {
//这里表示前两行或者是某行的第一个数和最后一个数时都为1
if(m<2||n==1||n==m)
value = 1;
else
value = C(m-1,n-1)+C(m-1,n); //其余都通过顶上两个数相加来计算
}
return value; //返回计算所得的值
}
这个问题的难点就在于理解了
C(m,n) = C(m-1,n-1)+C(m-1,n)
即可,递归就是酱紫蛋疼。。
小尾巴:
吾王剑之所指,即吾等身之所向。