[算法系列] 杨辉三角求值

写在前面:

     我是一个小小的程序员,我的野心是成为一个全栈工程师!!!

正文:

    这是我用来记录学习算法的一个系列。希望能与所有人共进步。

    这是第三个特殊算法,也涉及到数学,递归。代码及解释如下:

/*******************************
 **
 ** 算法:巴斯卡三角形(杨辉三角)
 **
 ** 问题:
 **                   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) 

即可,递归就是酱紫蛋疼。。

小尾巴:

    吾王剑之所指,即吾等身之所向。

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/u012966385/article/details/42716449
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞