C++递归计算指定数学函数时出现segmentation fault:11错误求解
问题原因及修复方案
核心错误分析
你遇到的段错误segmentation fault : 11本质是无限递归导致栈内存溢出,结合你的代码和题设要求,具体错误点如下:
- 递归逻辑完全倒置:题设给的公式是
g(2x) = 2g(x)/(1+g²(x)),要计算任意输入y对应的g(y),需要将y不断折半(即y = 2x → x = y/2),直到参数绝对值小于容差触发基准返回。但你当前代码中的递归参数没有缩小,反而生成了一个越来越大的val传入下一层递归,永远达不到终止条件,直接把栈撑爆。 - 公式运算优先级错误:原公式的分母是
1 + g²(x),你没有给分母加括号,C++会按运算符优先级把表达式解析为(2*g(x)/1) + g²(x),和题设要求完全不符。 - 递归调用逻辑不符合题设:你代码中完全没有按公式递归调用
g(x/2),反而自行构造了val值传入递归,和要求的数学逻辑完全脱节。 - 主函数逻辑冗余:两个for循环重复计算了
x=0的结果,且输出标注的g(2x)和传入的参数x不匹配,结果对应错误。
修正后代码
#include <iostream> #include <cmath> using namespace std; float recFunc(float); int main() { // 合并为单个循环,避免重复计算x=0 for (float x = -1.0f; x <= 1.0f; x += 0.1f) { // 要计算g(2x)就传入2*x,和输出标注对应 cout << "X Value = " << x << " : g(2x) = " << recFunc(2 * x) << endl; } return 0; } float recFunc(float x) { const float tol = 1e-6f; // 基准条件:|x|小于容差时直接返回近似值,浮点数绝对值用fabs if (fabs(x) < tol) { return x - x * x * x / 6.0f; } // 正确递归逻辑:先算x/2的g值,再按公式推导当前x的g值 float g_half = recFunc(x / 2.0f); return 2 * g_half / (1 + g_half * g_half); }
补充说明
修正后的代码递归深度最多约21层(输入最大值为2,每次折半到1e-6的计算次数),完全在栈内存的承受范围内,不会出现溢出问题。
内容的提问来源于stack exchange,提问作者HWFord16
相关产品推荐
相关产品推荐

