我需要计算C中测试统计数据的分布。测试统计数据基于秩。因此,我认为我可以使用自然数和所有可能的不同组合进行计算,而不是生成观测值并对其进行排序。所以我用C编写了一个代码。但它并没有显示预期的输出,我想只是一些符号。当我在一个在线编译器中运行它时,它显示了一个Segmentation错误。请帮我纠正错误。如有任何建议,我们将不胜感激。以下是我编写的代码。
#include<stdio.h>
#include<conio.h>
void main()
{
int i1,i2,i3,j1,j2,j3,i,k,p,m1,n1,combo1,combo2,combo3;
int fcombo1=0, fcombo2=0, fcombo3=0;
m1=3;
n1=3;
p=1;
int factorial(int n,int r);
for(i1=1;i1<=6;i1++)
for(i2=i1+1;i2<=6;i2++)
for(i3=i2+1;i3<=6;i3++)
for(j1=1;j1<=6;j1++)
if(j1!=i1&&j1!=i2&&j1!=i3)
for(j2=1;j2<=6;j2++)
if(j2!=i1&&j2!=i2&&j2!=i3&&j2>j1)
for(j3=1;j3<=6;j3++)
if(j3!=i1&&j3!=i2&&j3!=i3&&j3>j2)
{
for(i=1;i<=3;i++)
for(k=0;k<=1;k++)
{
if(i==1)
{
combo1=factorial(i-1,1)*factorial(m1-1,p)*factorial(i1-i,p-k)*factorial(n1-i1+i,p+k+1);
fcombo1=fcombo1+combo1;
}
else if(i==2)
{
combo2=factorial(i-1,p)*factorial(m1-1,p)*factorial(i2-i,p-
k)*factorial(n1-i2+i,p+k+1);
fcombo2=fcombo2+combo2;
}
else if(i==3)
{
combo3=factorial(i-1,p)*factorial(m1-1,p)*factorial(i3-i,p-
k)*factorial(n1-i3+i,p+k+1);
fcombo3=fcombo3+combo3;
}
printf("%3d%3d%3d%3d%3d%3d%3d%3d%3dn",i1,i2,i3,j1,j2,j3,
fcombo1,fcombo2,fcombo3);
}
}
getch();
}
int factorial(int n,int r)
{
if(n<r)
return(0);
else if(n==r)
return(1);
else if(r==1)
return(n);
else
return(factorial(n-1,r)+factorial(n-1,r-1));
}
输出:
1 2 3 4 5 6 0 0 0
1 2 3 4 5 6 0 0 0
1 2 3 4 5 6 0 0 0
1 2 3 4 5 6 0 2 0
1 2 3 4 5 6 0 2 0
1 2 3 4 5 6 0 2 4
1 2 4 3 5 6 0 2 4
1 2 4 3 5 6 0 2 4
1 2 4 3 5 6 0 2 4
1 2 4 3 5 6 0 4 4
1 2 4 3 5 6 0 4 8
Segmentation fault
首先,程序的设计方式使用了10个级别的for
循环,这样做通常是一个糟糕的想法,想想如何重构它。
其次,对于特定的问题,它在于factorial
函数,如果r
小于0
,例如对于factorial(1, 0)
的情况,该函数将无限递归,因为没有一个终止条件匹配。因此,由于函数中的堆栈溢出,程序被segfault中止。因此,根据您需要如何计算,在函数中添加一个终止条件,例如:
int factorial(int n,int r)
{
if(n<r)
return(0);
else if(n==r)
return(1);
else if(r<=1)
return(n);
else
return(factorial(n-1,r)+factorial(n-1,r-1));
}
or
if (r <= 0) abort(); // this should never happen
我只是想知道为什么我会出现分段错误。。。。
我想原因是堆栈溢出。您正在调用8个嵌套级别中的递归函数factorial
。因此,这将出现在数百万个电话中。
每次调用函数时,都会在堆栈中分配一些内存。超过数百万个嵌套调用,堆栈将溢出并导致分段故障