递归实现调和级数计算异常求助:返回值类型与整数除法问题
解决调和级数递归函数的问题
嘿,我来帮你排查这个递归函数的问题!你的思路是对的,但有两个关键细节没处理到位,导致计算结果不正确:
问题1:返回类型不匹配
你需要的是double类型的结果,但函数声明为long sum1(int i)——long是整数类型,会把所有小数部分直接截断,最终只能得到整数结果,完全不符合调和级数的预期。
问题2:整数除法的陷阱
在表达式1/i中,因为i是int类型,这里会执行整数除法:比如当i=2时,1/2的结果是0而不是0.5;i=3时,1/3也是0……除了递归到i=1时返回1,其他步骤累加的都是0,最终结果自然不对。
修正后的代码
只需要调整两个地方就能解决问题:
double sum1(int i) { if(i == 1) { return 1.0; // 返回double类型的1,确保底层结果是浮点数 } else { return sum1(i-1) + 1.0/i; // 用1.0触发浮点数除法,得到正确的分数值 } }
修正逻辑说明
- 终止条件返回
1.0,让递归的最底层就返回double类型,后续的回溯累加都会保持浮点数类型; - 把
1/i改成1.0/i,将其中一个操作数转为浮点数,这样整个除法运算就会按照浮点数规则执行,得到正确的1/i小数结果,再和之前的递归结果相加,最终就能得到准确的调和级数和。
内容的提问来源于stack exchange,提问作者T.v.L.
相关产品推荐
相关产品推荐

