2017-02-14 77 views
0

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

即使我写了一个好的基本案例,我的程序崩溃了。学习递归和清晰演示的任何链接都会对我非常有帮助。

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

代码:

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

:M =二项式(N-1,M); N =二项式(N-1,M-1);你不能用新的结果替换你的m值,因为你需要第二个二项式调用的原始m值。 – algojava

+0

@David Hoelzer谢谢你的帮助,但现在我已经对我的代码进行了修改,请问为什么它还不能正常工作?这里是代码: –

+0

#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); return o + p; } } } INT主() { 的printf( “请输入n的值:\ n”); 的scanf( “%LLD” &n); 的printf( “现在请输入的m的值:\ n”); 的scanf( “%LLD” &m); 结果=二项式(N,M); 的printf(“合力二项式系数:%lld \ n“,结果); return 0; } –

回答

0

二项式系数只为对ÑķN> = K定义。通常在二项式系数表达式中使用nk,但这些对应于代码中的nm

您需要包含一些输入错误检查以避免问题。你的代码崩溃时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()功能逻辑,在除去需要op:在这一部分

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; 
    } 
} 
+0

我通常不使用全局变量我知道它是一个坏主意,谢谢你.hmm,这真的是有用的队友,现在我明白了我的错误,非常感谢你的大量帮助@大卫保龄球 –

相关问题