MENU

递归三角塔

• November 3, 2020 • 递归

设计算法,输出如下形式:

要求:1.设计成递归函数,2.设计成循环结构函数

题目分析:

这个题目类似于杨辉三角形,但是比杨辉三角形简单一点点,因为这个图形的每一行数字都是一样的,两个要求,我们知道递归就是循环调用自身,然后后面这个要求又说设计循环结构函数,因此这个题目是要我们设计两种算法,一种算法是我们这一章的内容——递归,另一种就是我们的普通解法——循环语句

如何设计递归呢?

在这一章的前面几个题目中,我都会说到解递归有三个步骤,我们只要把握住这三个步骤,其他的都不是问题,管他怎么运行的,反正调用能出正确结果,人类只需要负责设计,而计算这些问题就交给计算机吧,人类的大脑只负责创新、记忆和运算是电脑的事情。

首先来设计递归:

1.确定参数,要打印多少行,因此总行数是一个参数;当前行打印哪个数字,以及打印多少个?我们发现第一行打印1个1,第二行打印两个2,第三行打印3个3,,,,,,,第n行打印n个n,所以行数得作为一个参数。

2.找参数规律,我们知道C语言在控制台输出是从左到右从上到下输出的,也就是程序一定是先打印1,换行再打印两个2,换行再打印3个3……,以此类推,明显,当前递归函数与上一个递归函数参数有一个加1的关系,即参数规律是i+1

3.找出口,当前递归函数的i还小于n的时候就一直打印,直到i(当前函数的)等于n的时候就停止打印

到此递归函数就设计好啦

那咱们再来看循环结构,循环结构很简单,我们把整个三角看成一个平面,只需要一个嵌套循环,我们就可以实现打印三角,外循环控制打印的行数,内循环控制每一行打印的个数以及打印的数字

代码实现:

#include<stdio.h>
#include<stdlib.h>
/*设计成递归函数*/
void fact(int n, int i)   //总行数,当前行数
{
    if (i == n+1)         //递归出口
        return;
    else
    {
        for (int j = 0; j < i; j++)  //打印i个i
            printf("%-5d", i);       //-5:数字占5位,靠左
        printf("\n");
        return fact(n, i + 1);       //参数规律,下一行比上一行数值多1,因此规律是i+1
    }
    return;
}
/*设计成循环结构函数*/
void loop(int n)
{
    for (int i = 1; i <= n; i++)     //行数
    {
        for (int j = 1; j <= i; j++) //每一行该打印数字的个数
            printf("%-5d", i);       //-5:数字占5位,靠左
        printf("\n");                //一行打印完了之后换行
    }
}
int main()
{
    int n;
    printf("请输入n的值:");
    scanf_s("%d", &n);
    printf("设计成递归函数:\n");
    fact(n,1);
    printf("\n\n设计成循环结构函数:\n");
    loop(n);
    system("pause");
    return 0;
}

运行结果:


测试一



测试二



测试三



代码编译器:Visual Studio 2017
ok

Archives QR Code Tip
QR Code for this page
Tipping QR Code