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

使用递归打印杨辉三角时出现Segmentation Fault错误

问题分析与解决

段错误原因

你的代码出现Segmentation Fault的核心问题是阶乘函数fact的边界条件错误:

  • 初始版本中,fact只处理了num==1的情况,当num=0时(比如i=0,j=0时会调用fact(0)),函数会递归调用fact(-1)、fact(-2)……无限递归导致栈溢出,触发段错误。
  • 你后来添加if(num==0){return 0;}的做法也不对,因为数学上0! = 1,返回0会导致组合数计算时出现0/(0*0)的除零操作,同样会引发程序崩溃。

修正后的代码

首先修正阶乘函数的边界条件,正确处理num=0和num=1的情况:

#include <iostream>
using namespace std;

int fact(int num){
    // 0! 和 1! 都等于1
    if(num <= 1){
        return 1;
    }
    return num * fact(num-1);
}

int main(){
    cout<<"Enter a Number!\n";
    int n;
    cin>>n;
    int iCj;
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
            iCj = fact(i)/(fact(j) * fact(i-j));
            cout<<iCj<<" ";
        }
        cout<<"\n";
    }
    return 0;
}

额外优化建议

用递归阶乘计算组合数生成杨辉三角的效率很低,而且当n稍大时(比如n>12),int类型会出现溢出问题。更高效的方式是直接用杨辉三角的递推性质:每一行的元素等于上一行相邻两个元素之和,不需要计算阶乘:

#include <iostream>
using namespace std;

int main(){
    cout<<"Enter a Number!\n";
    int n;
    cin>>n;
    
    // 创建二维数组存储杨辉三角
    int triangle[n][n];
    for(int i=0;i<n;i++){
        // 每行首尾元素都是1
        triangle[i][0] = 1;
        triangle[i][i] = 1;
        // 递推计算中间元素
        for(int j=1;j<i;j++){
            triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
        }
        // 打印当前行
        for(int j=0;j<=i;j++){
            cout<<triangle[i][j]<<" ";
        }
        cout<<"\n";
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:10:59