为什么自定义递归幂函数传入非0/1的b值时返回-nan(ind)错误
错误原因
- 核心问题是非void返回值的函数,在b>1的执行分支没有显式返回值,属于C语言的未定义行为。
你的代码中,当入参b不为0或1时,执行完a *= c;后仅调用了递归函数power_func(a, b - 1, c),但没有将递归调用的结果作为当前函数的返回值返回。C语言规范要求,声明了非void返回类型的函数,所有执行分支都必须显式返回对应类型的值,否则读取函数返回值时会得到不可预测的结果,你遇到的-nan(ind)就是这类未定义行为的典型表现。
修复方案
只需要在递归调用前加return关键字,把递归结果向上传递即可:
double power_func(double a, int b, double c) { if (b == 0) return 1.0; else if (b == 1) return a; else a *= c; return power_func(a, b - 1, c); }
额外优化提示
你的当前实现需要额外传入初始底数作为第三个参数c,逻辑上可以简化为只传底数和幂次两个参数:
double power_func(double base, int exp) { if (exp == 0) return 1.0; return base * power_func(base, exp - 1); }
如果要处理负幂次可以再加对应分支判断即可。
内容的提问来源于stack exchange,提问作者Hwi
相关产品推荐
相关产品推荐

