You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:06:03