帕斯卡三角

时间:2014-08-04 15:40:59

标签: c math

我正在尝试使用以下代码打印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);
  }

3 个答案:

答案 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);
}