You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:36:03