我正在尝试使用以下代码打印Pascal的三角形。但在打印完第一个' 1'编译器遇到错误,我必须手动停止执行。代码中可能出现的错误是什么?
编辑:事实功能已如所示更改,没有任何区别。 我正在使用Codeblocks 10.05。弹出一个对话框窗口,说明.exe已停止工作,Windows正在搜索解决方案。
#include <stdio.h>
void comb(int,int);
int fact(int);
int main()
{
int n,row;
scanf("%d",&n);
int j,k;
for(row=1;row<=n;row++)
{
for(j=0;j<n-row;j++)
{
printf(" ");
}
for (k=0;k<2*row-1;k++)
{
comb(row-1,k);
}
printf("\n");
}
return 0;
}
void comb(int a,int b)
{
if(a==0)
printf("%d",1);
printf("%d",fact(a)/(fact(a-b)*fact(b)));
}
int fact(int num)
{
if(num == 1)
{
return 1;
}
else return num*fact(num-1);
}
答案 0 :(得分:3)
您的问题是fact(0)
将进入无限循环调用fact(-1)
,然后调用fact(-2)
,依此类推。最终由于递归耗尽堆栈空间而崩溃。
fact(0)
如何发生?在fact(a-b)
时调用a == b
时。
这当前发生在row == 2, k == 1
。
答案 1 :(得分:2)
我可以看到两个错误
事实函数:它是无限递归的
调用梳状函数的循环边界不正确。每行有+ 1行,而不是2 *行 - 1.您的公式仅适用于前两行。
试试此代码
#include <stdio.h>
void comb(int,int);
int fact(int);
int main()
{
int n;
printf("Height: ");
scanf("%d",&n);
for(int row = 1; row <= n; row++)
{
if( row == 1)
printf(" ");
for(int j = 0;j < n - row; j++)
{
printf(" ");
}
for (int k = 0;k < row + 1;k++)
{
if ( row != 1)
comb(row,k);
else
{
printf("1");
break;
}
}
printf("\n");
}
return 0;
}
void comb(int a,int b)
{
printf("%d ",fact(a)/(fact(a-b)*fact(b)));
}
int fact(int num)
{
if(num > 1)
return num * fact(num-1);
else
return 1;
}
答案 2 :(得分:0)
int main(){
int n,row;
scanf("%d",&n);
int j,k;
for(row=1;row<=n;row++)
{
for(j=0;j<n-row;j++)
{
printf(" ");
}
for (k=0;k<=row-1;k++)
{
comb(row-1,k);
}
printf("\n");
}
return 0;
}
void comb(int a,int b){
printf("%d",fact(a)/(fact(a-b)*fact(b)));
}
int fact(int num){
if(num < 2)
return 1;
else
return num*fact(num-1);
}