递归实现金字塔函数疑问:输入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时的完整执行流程
- 主函数调用
draw(1),进入函数后判断1 <= 0?不成立,跳过终止条件。 - 执行
draw(1-1)也就是draw(0),进入这个调用:- 判断
0 <= 0?成立,直接return,不会执行后续的递归调用和循环,这个调用直接结束。
- 判断
- 回到
draw(1)的执行流程,跳过递归调用后,执行for循环:打印1个#,然后换行。 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
相关产品推荐
相关产品推荐

