C语言递归二项式系数函数返回错误结果,求原因
你的二项式系数递归函数bug分析与修复
嘿,我一眼就揪出问题所在了——你在终止条件的判断里犯了个超容易踩坑的语法错误!
错误根源
看你代码里这一行:
if ((k = 0) || (k == n)) return 1;
这里你用了赋值运算符=,但实际上需要的是比较运算符==。
这个错误的影响非常关键:
k = 0会直接把变量k的值改成0,而这个表达式的返回值是被赋的0(在C里代表逻辑假)。- 因为左边表达式为假,
||会继续判断右边的k == n,但此时k已经被改成0了,只有当n等于0时才会触发返回1的条件,完全破坏了二项式系数的终止逻辑(原本应该是k=0或k=n时返回1)。 - 失去正确终止条件的递归会疯狂调用自身,最终算出完全错误的结果(你得到的16就是这么来的),甚至可能引发栈溢出。
修复后的代码
只需要把赋值改成比较,就能得到正确结果:
#include<stdio.h> int binomial(int n, int k) { // 把k = 0改成k == 0 if ((k == 0) || (k == n)) return 1; if (k > n) return 0; return binomial(n - 1, k - 1) + binomial(n - 1, k); } int main() { // 测试n=4,k=2 printf("%d\n", binomial(4, 2)); // 现在会输出正确的6 return 0; }
给初学者的小建议
写条件判断时,可以试着把常量放在左边(比如写成0 == k而非k == 0),这样如果不小心写成0 = k,编译器会直接报错,帮你提前规避这类低级错误~
内容的提问来源于stack exchange,提问作者franx
相关产品推荐
相关产品推荐

