C语言如何实现递归版本drawPyramid()金字塔绘制函数
drawPyramid完全可以通过递归实现,你提到的需要保留初始高度n的思路是正确的,我们通过递归函数传参的方式就能一直持有总高度数值,不需要额外设置全局变量存储。
实现思路
- 递归核心是拆分问题:绘制总高度为n的金字塔,可以拆解为「从第1层开始,逐层绘制到第n层」的重复逻辑
- 递归辅助函数设置两个入参:
current(当前要绘制的层数,从1开始)、total(金字塔总高度,递归过程中保持不变),每层都可以通过total - current计算得到需要的前置空格数 - 递归终止条件:当前层数
current大于总高度total时,直接结束递归 - 连续打印重复字符的逻辑也可以封装为独立的递归小函数,保持整体递归风格
完整可运行代码
#include <stdio.h> // 对外暴露的递归版金字塔接口,和原迭代版参数保持一致 void drawPyramid_rec(int n); // 递归辅助函数:绘制第current层,总高度为total void draw_level(int current, int total); // 递归工具函数:连续打印count个字符c void print_chars(char c, int count); int main(void) { int n; do { printf("Height: "); scanf("%i", &n); } while (n > 8 || n < 1); drawPyramid_rec(n); return 0; } void drawPyramid_rec(int n) { // 从第1层开始绘制 draw_level(1, n); } void draw_level(int current, int total) { // 递归终止条件:所有层绘制完成 if (current > total) { return; } // 绘制当前行 print_chars(' ', total - current); // 前置空格 print_chars('#', current); // 左半部分# print_chars(' ', 2); // 中间分隔空格 print_chars('#', current); // 右半部分# putchar('\n'); // 换行 // 递归绘制下一层 draw_level(current + 1, total); } void print_chars(char c, int count) { if (count <= 0) { return; } putchar(c); print_chars(c, count - 1); }
运行效果
输入高度为5时,输出和迭代版完全一致:
Height: 5 # # ## ## ### ### #### #### ##### #####
如果你觉得额外封装
print_chars太繁琐,也可以直接在draw_level里用循环实现字符打印,核心的分层递归逻辑不需要改动。
内容的提问来源于stack exchange,提问作者livemyaerodream
相关产品推荐
相关产品推荐

