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

递归实现金字塔函数疑问:输入height=1时n为何不会变为0?

递归绘制金字塔的逻辑详解

问题描述

我对这段用递归替代嵌套for循环实现的金字塔绘制函数存在困惑,尤其针对代码中的draw(n - 1);语句。当输入金字塔高度为1时,我不理解为何n不会变为0,希望得到该递归逻辑的详细解释。

代码示例

#include <iostream>
#include <string.h>

using namespace std;

int i;

void draw(int n);


int main() {
    
 // Get height of pyramid
    int height;
    cout << "Input Height: "; cin >> height;

    // Draw pyramid
    draw(height);
      return 0;
}



void draw(int n)
{
    // If nothing to draw
    if (n <= 0)
    {
        return;
    }

    // Draw pyramid of height n - 1
    draw(n - 1);

    // Draw one more row of width n
    for (int i = 0; i < n; i++)
    {
        printf("#");
    }
    printf("\n");
}

递归逻辑拆解

首先明确递归的核心是「先拆解问题,再回溯执行」,这个函数的逻辑是:要画高度为n的金字塔,先画高度为n-1的金字塔,再画一行n个#。

当输入高度为1时的完整执行流程

  1. 主函数调用draw(1),进入函数后判断1 <= 0?不成立,跳过终止条件。
  2. 执行draw(1-1)也就是draw(0),进入这个调用:
    • 判断0 <= 0?成立,直接return,不会执行后续的递归调用和循环,这个调用直接结束。
  3. 回到draw(1)的执行流程,跳过递归调用后,执行for循环:打印1个#,然后换行。
  4. draw(1)执行完毕,回到主函数,程序结束。

你误以为n不会变成0?不对,n确实会变成0,但draw(0)触发了终止条件if(n<=0),直接返回,不会执行任何绘制操作,所以你看不到它的影响,但它是递归终止的关键——没有这个条件,递归会无限调用直到栈溢出。

一般情况的递归展开(以n=3为例)

  • 调用draw(3) → 先调用draw(2)
    • 调用draw(2) → 先调用draw(1)
      • 调用draw(1) → 先调用draw(0)(直接返回)
      • 回到draw(1),打印1个#
    • 回到draw(2),打印2个#
  • 回到draw(3),打印3个#

最终输出:

#
##
###

简单来说,递归的过程是先一层层深入到终止条件,再从最底层往回执行绘制逻辑,每一层递归负责绘制当前高度对应的那一行。

内容的提问来源于stack exchange,提问作者nubDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:20:27