嗨,这是我计算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);
}
答案 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
。
每行包含与行号相同的列数。
所以,我可以说 -
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);
}
希望这有帮助。