设计算法,输出如下形式:
要求: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