第十题
3-9难度系数1 打印菱形图案 (5分)
这道题完美的诠释了什么叫格式
先来观察输出的格式
这里是输入7,输出这个菱形
菱形的上下对称
每一行的 “*
” 数量均为奇数
很自然我们想到递归
这里简单解释一下递归
将一个运用递归的函数f(x),根据再次调用f(x)的语句,分为上下两部分,如图
比如这个函数f(x)
void f(int x){
cout << x << endl;
if(x != 1){
f(x - 1);
cout << x << endl;
}
}
当输入x = 4,调用f时
//递 部分
f(4)//第一次调用
cout << 4 << endl;
f(4 - 1)//第二次调用
cout << 3 << endl;
f(3 - 1)//第三次调用
cout << 2 << endl;
f(2 - 1)//第四次调用
cout << 1 << endl;
//此时x = 1,if条件判断不成立,故递归终止
//归 部分
cout << 2 << endl;//第三次调用的函数还没执行结束
cout << 3 << endl;//第二次调用的函数还没执行结束
cout << 4 << endl;//第一次调用的函数还没执行结束
最后输出结果是:
4
3
2
1
2
3
4
参考文章对于递归有没有什么好的理解方法?
有兴趣的同学可以实验一下,将上述f(x)中的if语句中的cout << x << endl;
放在if语句之外会发生什么?
先处理“*
”部分
void f(int a, int b){
//变量a是总行数,作用是规定 递 的次数,变量b初始值为1,作用的是规定一行输出多少个“ * ”
for(int i = 1;i <= b;++i) cout << "*" << " ";//递 部分
cout << endl;
if(a != 1){
f(a - 2,b + 2);
for(int i = 1;i <= b;++i) cout << "*" << " ";//归 部分
cout << endl;
}
}
调用f(7,1)输出结果为
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
有内味了
接下来看空格
空格的规律是:6,4,2,0,2,4,6
再看看a的变化规律:7,5,3,1,3,5,7
b变化规律:1,3,5,7,5,3,1
发现,空格数量就是a - 1
运用printf
格式输出
printf("%*s",a - 1,"");
看不懂的看这里
printf(%*.*f,m,n,f)
printf “%.*s”
当然也可以使用for
来输出空格
for(int i = 1;i <= a - 1;++i) cout << " ";
再加上输入语句
这题就解完了
完整代码如下
#include<iostream>
#include<stdio.h>
using namespace std;
void f(int a, int b){
printf("%*s",a - 1,"");
for(int i = 1;i <= b;++i) cout << "*" << " ";
cout << endl;
if(a != 1){
f(a - 2,b + 2);
printf("%*s",a - 1,"");
for(int i = 1;i <= b;++i) cout << "*" << " ";
cout << endl;
}
}
int main(){
int inp;
cin >> inp;
f(inp,1);
}
提交结果如下