Pascal在c中的三角形,具有递归函数

时间:2017-11-20 17:37:12

标签: c

嗨,这是我计算pascal三角形的代码,但它运行错误:已停止工作......为什么? 我认为它的错误在于paskal功能

#include <stdio.h>

long paskal(int,int);

int main (void)
{
    int  n = 0 ;
    int m = 0 ;
    int k  = 0 ;

    scanf("%d" , &n);

    for(k = 1  ; n >= k ;   )
    {
        for(  m = 1 ; k >= m   ; m++ )
        {
            long f = paskal(k , m ) ;
            printf("%ld" , f);
        }
        printf("\n");
        k++;
    }

     return 0; 
}

long paskal( int n , int i ) 
{
    if(n == 1 && i == 1 )
        return 1 ; 
    else
        return paskal(n-1,i) + paskal(n-1,i-1);
}

4 个答案:

答案 0 :(得分:2)

限制条件不正确。

设置限制条件的正确方法是

if(n == 1 || i == 1 )
    return 1 ; 
else
    ....

答案 1 :(得分:1)

#include <stdio.h>

long paskal(int,int);

int main (void)
{
    int  n = 0 ;
    int m = 0 ;
    int k  = 0 ;

    scanf("%d" , &n);

    for(k = 0  ; k<n ;   )
    {
        for(  m = 0 ; m<k   ; m++ )
        {
            long f = paskal(k , m ) ;
            printf("%ld" , f);
        }
        printf("\n");
        k++;
    }

     return 0; 
}

long paskal( int n , int i ) 
{
    if(i == 1 || n == i )
        return 1 ; 
    else
        return paskal(n-1,i) + paskal(n-1,i-1);
}

您的代码中有一些错误。现在您的代码可以使用了。

答案 2 :(得分:0)

看起来你只需考虑i> n和i或n = 0的情况:

long paskal( int n , int i ) 
{
if(i<0 || n<0 || i>n) return 0;
if(n == 1)
    return 1 ; 
else

    return paskal(n-1,i) + paskal(n-1,i-1);
}

答案 3 :(得分:0)

您的代码几乎没有像递归终止条件那样的问题:

if(n == 1 && i == 1 )

这是不正确的,导致永久递归函数,最终程序将异常终止。

此外,如果你修复了这个条件,你就不会得到Pascal三角形作为输出,因为for中的main()循环都在用1初始化循环变量吃掉每排帕斯卡三角形的第一列。

对于递归函数paskal()的终止条件 -

在函数long paskal( int n , int i )中,n表示行,而i表示该特定行中的列,pascal()函数应该计算元素一个特定的位置。

Pascal三角形中的几点:

  1. 每一行的最左边和最右边的元素是1

  2. 每行包含与行号相同的列数。

  3. 所以,我可以说 -

    if(n == i || i == 0) //i.e. if ((row == col) || (col == 0)) return 1;
        return 1;
    

    可能是递归函数的终止条件。

    总的来说,你的程序将是这样的:

    #include <stdio.h>
    
    long paskal(int, int);
    
    int main() {
       int n = 0;
       int m = 0;
       int k = 0;
       int s = 0;
       printf ("Enter number of rows:\n");
       scanf("%d", &n);
    
       for(k = 0; n >= k; k++) {
                for(s = 0; s < n-k; s++) //Add spaces before each row
                        printf(" ");
                for(m = 0; k >= m; m++) {
                        long f = paskal(k, m);
                        printf("%ld ", f);
                }
                printf("\n");
        }
        return 0;
    }
    
    long paskal(int n, int i) {
            if(n == i || i == 0)
                    return 1;
            else
                    return paskal(n-1, i) + paskal(n-1, i-1);
    }
    

    希望这有帮助。