使用递归打印杨辉三角时出现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
相关产品推荐
相关产品推荐

