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

递归打印倒三角星号时省略else分支引发段错误的原因

段错误根本原因:无互斥分支导致无限递归爆栈

你遇到的核心转储报错,本质是省略else后代码逻辑没有分支互斥,触发了永远不会终止的递归,最终耗尽程序调用栈内存被系统强制终止,具体执行流程问题如下:

  • C++里if条件分支如果没有配套else,分支内代码执行完后,会顺次执行分支外的后续代码,不会自动跳过。也就是说当i==n成立时,你的代码跑完分支里的换行、recur1(n-1, 0)调用之后,还会接着执行后面打印*、调用recur1(n, i+1)的逻辑,这就是bug的源头。
  • 拿初始调用recur1(5,0)举例,当i累加到等于5时:
    1. 先进入if分支:打印换行,调用recur1(4,0),等n=4对应的所有递归逻辑全部执行完,回到当前调用层
    2. 不会做任何跳转,直接执行分支外代码:打印一个多余的*,然后调用recur1(5, 6)
    3. 这层新调用里n固定为5,i已经是6,永远满足不了i==n的条件,也碰不到n==0的递归终止条件,i会一直无限加1,递归层数无限制上涨
  • 正确代码里的else作用就是做强制分支互斥:要么走换行、n减1重置i的递归路径,要么走打印星号、i加1的递归路径,两个路径绝对不会同时执行,从根源上堵死了无限递归的可能。

程序的调用栈有固定大小上限,无限递归会快速占满这部分内存,操作系统会直接杀掉进程,抛出你看到的段错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:57:16