【递归】顺便画画
参考蓝桥杯 打印图形 这道题,还是没理解它是怎么递归绘制出来的。具体实现代码参考上面的链接。
下面我用递归顺便画画几个图形,体会一下这道题是怎么实现的
一、递归绘制实心三角形
想要绘制的效果:
n = 4:
*
* *
* * *
* * * *
n = 6:
*
* *
* * *
* * * *
* * * * *
* * * * * *
实现代码:
#include <bits/stdc++.h>
#include<math.h>
using namespace std;
#define N 70
//实心
void f(char a[][N], int rank, int row, int col)
{
if (rank == 0)
{
return;
}
else if(rank == 1){
a[row][col] = '*'; //绘制叶子点
return;
}
a[row][col] = '*'; //绘制中点
f(a, rank - 1, row + 1, col - 1); //左子树
f(a, rank - 1, row + 1, col + 1); //右子树
}
int main()
{
char a[N][N];
int i, j;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
a[i][j] = ' ';
int rank = 4;
int col = rank - 1;
f(a, rank, 0, col);
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%c", a[i][j]);
printf("\n");
}
return 0;
}
二、递归绘制空心三角形(不成功 + 分析原因)
n = 4:
*
* *
* *
* * * *
n = 6:
*
* *
* *
* *
* *
* * * * * *
实现代码:
#include <bits/stdc++.h>
#include<math.h>
using namespace std;
#define N 70
//空心
void f1(char a[][N], int rank, int row, int col, int max_rank, int mid)
{
if (rank == 0)
{
return;
}
else if(rank == 1){
a[row][col] = '*'; //绘制叶子点
return;
}
else if(rank == 2 || rank == max_rank){
a[row][col] = '*'; //绘制中点
f1(a, rank - 1, row + 1, col - 1, max_rank, col); //左子树
f1(a, rank - 1, row + 1, col + 1, max_rank, col); //右子树
}
if(rank > 2 && rank != max_rank){
a[row][col] = '*'; //绘制中点
if(mid < col){ //右节点只产生右子树
f1(a, rank - 1, row + 1, col + 1, max_rank, col);
}else{ //左节点只产生左子树
f1(a, rank - 1, row + 1, col - 1, max_rank, col);
}
}
}
int main()
{
char a[N][N];
int i, j;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
a[i][j] = ' ';
int rank = 4;
// int col = pow(2, rank - 1) - 1; //中点列标
int col = rank - 1;
f1(a, rank, 0, col, rank, col);
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%c", a[i][j]);
printf("\n");
}
return 0;
}
实现结果:未成功,我猜测主要原因是无法找到递归的通式,无法保证在中间空心的情况下,还能通过递归绘制最后一行。
n = 4:
*
* *
* *
* * * *
n = 6:
*
* *
* *
* *
* *
* * * *