c-秩测试的零分布



我需要计算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。因此,这将出现在数百万个电话中。

每次调用函数时,都会在堆栈中分配一些内存。超过数百万个嵌套调用,堆栈将溢出并导致分段故障

相关内容

  • 没有找到相关文章

最新更新