C语言递归算法系列_打印杨辉三角 循环与递归同时使用(4)

杨辉三角又名Pascal三角。其结构存储在一个二维数组里可以当成一个下三角矩阵。

其核心是 每行的行首元素和对角线元素(行列坐标相等)的情况下存储数字1,其它情况下为其腰上的两个元素之和。下面我们就从循环和递归两种方法打印杨辉三角。


1.循环,唯一遇到的困难就是二维数组传参,我为了简便,用了全局变量!

#include <stdio.h>
int a[10][10];


void cyanghui(int size)
{
    int i, j;
    for (i = 0; i < size; i++)
    {
        for (j = 0; j <= i; j++)
        {
            if (j == 0 || j == i)
                a[i][j] = 1;
            else
                a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
        }
    }
}


void printyanghui(int size)
{
    int i, j;
    for (i = 0; i < size; i++)
    {
        for (j = 0; j <= i; j++)
        {
           printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}
int main(void)
{
    printf("Inputer YangHui triangle's size(<11):");
    int size;
    scanf("%d", &size);
    cyanghui(size);
    printf("Output:\n");
    printyanghui(size);
    return 0;
}

运行结果(下三角形): 

2.递归

我们还是按照那个思路来:

先分析简单情况,就是行首和行列相等时返回1,函数中止。

就是上面双重循环里if情况

否则就求其腰上的两个元素之和,其腰上的两个元素要么为1,要么等于它们腰上的数之和,这就产生了一般规律。

代码如下:

#include <stdio.h>

int yanghui(int i, int j)
{
    if(j == 0 || i == j)
        return 1;
    return yanghui(i - 1, j - 1) + yanghui(i - 1, j);
}

int main(void)
{
            printf("Please input Pascal Triangle's rows:");
            int row;
            scanf("%d", &row);
            printf("\nThere are %d rows Pascal Triangle will be output:\n", row);

             int a[20][20];
             int i, j, k;
            for (i = 0; i < row; i++)
                for (j = 0; j <= i; j++)
                    a[i][j] = yanghui(i, j);

            for (i = 0; i < row; i++)
            {
                for (k = row - i + 7; k > 0; k--)
                {
                    printf("  ");
                }

                for (j = 0; j <= i; j++)
                {
                     printf("%d   ", a[i][j]);
                }
                printf("\n\n");
            }
    return 0;
}

测试输出(这次我们修改了一下输出格式,“腰上”更加看得清晰):



              我们可以看到,递归函数相当简洁。如果有递推式子,写起递归代码来更加得心应手。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值