C中的二项式系数递归解
Binomial coefficient recursive solution in C
为什么我的二项式系数解法崩溃了?我真的尝试过学习递归,但我仍然认为我对此不清楚。不知道有没有人能帮我学习一下递归,递归怎么思考?
即使我写了一个好的基本案例,我的程序也会崩溃。任何link通过清晰的演示来学习递归对我来说都是非常有帮助的。
这是我的二项式系数代码,我找不到 bug/error,寻求您的帮助。
代码:
#include<stdio.h>
long long m,n,o,p,result;
long long binomial(long long n,long long m)
{
if(n==m)
return 1;
else {
if(m==0)
return 1;
else {
o=binomial(n-1,m);
p=binomial(n-1,m-1);
return o+p;
}
}
}
int main()
{
printf("Please Enter The Value Of n:\n");
scanf("%lld",&n);
printf("Now Enter The value of m:\n");
scanf("%lld",&m);
result = binomial(n,m);
printf("Resultant Binomial coefficient: %lld\n",result);
return 0;
}
二项式系数只为 n 和 k 对定义,当 n >= k.通常在二项式系数表达式中使用 n 和 k,但它们对应于 n
和 m
代码。
您需要包含一些 error-checking 的输入以避免出现问题。当 n
小于 m
时,您的代码会崩溃,因为每次执行语句 o=binomial(n-1,m);
时,被调用函数中 n
的值都会减少,但是 n
已经小于 m
,它是非零的(如果 m
为零,函数将简单地返回 1
),因此 n == m
永远不会发生。
顺便说一下,您可以通过几种方式改进您的代码。使用全局变量通常是一个坏主意,最好移动声明:
long long m, n, result;
进入main()
,这里需要这些变量。此外,main()
的函数签名应为 int main(void)
。您可以大大加强 binomial()
函数中的逻辑,从而不再需要 o
和 p
:
long long binomial(long long n,long long m)
{
if (m != 0 && n != m) {
return binomial(n-1, m) + binomial(n-1, m-1);
} else {
return 1;
}
}
为什么我的二项式系数解法崩溃了?我真的尝试过学习递归,但我仍然认为我对此不清楚。不知道有没有人能帮我学习一下递归,递归怎么思考?
即使我写了一个好的基本案例,我的程序也会崩溃。任何link通过清晰的演示来学习递归对我来说都是非常有帮助的。
这是我的二项式系数代码,我找不到 bug/error,寻求您的帮助。
代码:
#include<stdio.h>
long long m,n,o,p,result;
long long binomial(long long n,long long m)
{
if(n==m)
return 1;
else {
if(m==0)
return 1;
else {
o=binomial(n-1,m);
p=binomial(n-1,m-1);
return o+p;
}
}
}
int main()
{
printf("Please Enter The Value Of n:\n");
scanf("%lld",&n);
printf("Now Enter The value of m:\n");
scanf("%lld",&m);
result = binomial(n,m);
printf("Resultant Binomial coefficient: %lld\n",result);
return 0;
}
二项式系数只为 n 和 k 对定义,当 n >= k.通常在二项式系数表达式中使用 n 和 k,但它们对应于 n
和 m
代码。
您需要包含一些 error-checking 的输入以避免出现问题。当 n
小于 m
时,您的代码会崩溃,因为每次执行语句 o=binomial(n-1,m);
时,被调用函数中 n
的值都会减少,但是 n
已经小于 m
,它是非零的(如果 m
为零,函数将简单地返回 1
),因此 n == m
永远不会发生。
顺便说一下,您可以通过几种方式改进您的代码。使用全局变量通常是一个坏主意,最好移动声明:
long long m, n, result;
进入main()
,这里需要这些变量。此外,main()
的函数签名应为 int main(void)
。您可以大大加强 binomial()
函数中的逻辑,从而不再需要 o
和 p
:
long long binomial(long long n,long long m)
{
if (m != 0 && n != m) {
return binomial(n-1, m) + binomial(n-1, m-1);
} else {
return 1;
}
}