为何含变量的递归代码无法运行?两段二项式系数递归代码排查
两段递归二项式系数代码的运行差异分析
核心问题出在第二段代码的rekurs函数缺少返回语句,触发了未定义行为:
第一段代码的正确逻辑
第一段的rekurs函数所有分支都有明确的返回值:
- 触发边界条件(k=0、n=0或n=k)时,直接
return 1; - 递归分支直接返回两次递归调用的结果之和。
代码片段:
int rekurs(int n, int k) { if((k==0)||(n==0)||(n==k)) { return 1; } else{ return rekurs(n-1,k-1)+ rekurs(n-1,k); } }
第二段代码的致命缺陷
第二段的rekurs函数在边界条件分支里,只给ergebnis赋值为1,却没有执行return语句。当程序走到这个分支时,函数会执行完if块后直接走到函数末尾,没有返回任何值——这属于C语言里的未定义行为,会导致返回随机垃圾值,甚至程序崩溃。
问题代码片段:
int rekurs(int n, int k) { int ergebnis; if((k==0)||(n==0)||(n==k)) { ergebnis = 1; // 这里没有return语句! } else{ return ergebnis = rekurs(n-1,k-1)+ rekurs(n-1,k); } // 函数走到此处无返回值,触发未定义行为 }
另外补充:两段代码的main函数里都有个小问题——printf中的zahlen变量未定义,但这不是第二段代码无法正常运行的核心原因。
修复第二段代码的方法
只需要在边界条件的if分支里补上返回语句即可:
int rekurs(int n, int k) { int ergebnis; if((k==0)||(n==0)||(n==k)) { ergebnis = 1; return ergebnis; // 补上返回语句 } else{ return ergebnis = rekurs(n-1,k-1)+ rekurs(n-1,k); } }
内容的提问来源于stack exchange,提问作者user20934377
相关产品推荐
相关产品推荐

