【问题标题】:Binomial coefficient recursive solution in CC中的二项式系数递归解
【发布时间】:2017-02-17 01:41:27
【问题描述】:

为什么我的二项式系数解决方案会崩溃?我真的尝试过学习递归,但我仍然认为我不清楚。我想知道是否有人可以帮助我了解递归以及如何递归思考?

即使我编写了一个好的基本案例,我的程序也会崩溃。任何学习递归的链接都对我很有帮助。

这是我的二项式系数代码,我找不到错误/错误,寻求您的帮助。

代码:

#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;
}

【问题讨论】:

  • 在这部分:m=binomial(n-1,m); n=二项式(n-1,m-1);您不能用新结果替换您的 m 值,因为您需要第二个二项式调用的原始 m 值。
  • @David Hoelzer 感谢您的帮助,但现在我已经对我的代码进行了更改,请您看看为什么它仍然无法正常工作?这是代码:
  • #include long long m,n,result,o,p; long long binomial(long long n,long long m) { if(n==m)return 1; else{ if(m==0)return 1; else{ o=二项式(n-1,m); p=二项式(n-1,m-1);返回 o+p; } } } int main() { printf("请输入 n 的值:\n"); scanf("%lld",&n); printf("现在输入 m 的值:\n"); scanf("%lld",&m);结果=二项式(n,m); printf("结果二项式系数:%lld\n",result);返回0; }
  • 你使用 n 和 m 的什么值?请注意,由于您测试n == m,如果您有n &lt; m,您的第一个二项式o=binomial(n-1,m); 将永远不会退出,但会不断递归。你应该检查这不会发生。
  • 是的,当 n 小于 m 时,例如对于 2 和 5 输入,我的程序崩溃,我明白你只是因为我的基本情况检查 n==m,然后如果 n 小于 m意味着我的程序将继续递归调用,直到堆栈溢出,但是我已经尝试过这个,这个链接:@ 987654321@ 请检查它。在那个链接中,算法与我在我的程序中写的一样吗?请问有什么办法可以解决这个问题吗?谢谢

标签: c recursion binomial-coefficients


【解决方案1】:

二项式系数仅在 n >= k 时为 n 和 k 对定义。通常在二项式系数表达式中使用 n 和 k,但它们对应于代码中的 n 和 m。

您需要对输入进行一些错误检查以避免出现问题。当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;
    }
}

【讨论】:

  • 我通常不使用全局变量,我知道这是个坏主意,谢谢.hmm,这真的很有帮助,现在我明白了我的错误,非常感谢你的大力帮助@大卫保龄球
猜你喜欢
  • 1970-01-01
  • 2018-10-06
  • 2011-05-03
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
相关资源
最近更新 更多