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

递归获取两点间多个中点的实现及JavaScript代码调试求助

解决递归返回undefined问题,实现中点细分序列

我来帮你搞定这个递归函数返回undefined的问题,同时实现你想要的不断细分中点的需求。先看看你的代码问题出在哪,再给你修正后的完整实现。

问题根源分析

  1. 递归无返回值:当线段距离大于0.1时,你调用了两次递归,但没有返回处理后的latLong数组,导致上层调用拿不到结果,最终返回undefined。
  2. 点收集不完整:当前终止条件只添加了(x1,y1),会漏掉终点(x2,y2),而且初始调用时也没把起点加入数组,导致序列不完整。
  3. 中点顺序逻辑模糊:原递归逻辑没有明确的中点插入顺序,可能导致生成的点序列不符合你的预期。

修正后的完整代码

// 定义起点和终点
const start = { latitude: 5, longitude: 4 };
const end = { latitude: 8, longitude: 7 };
// 初始化数组,先加入起点
const latLong = [start];
// 调用递归函数生成中点序列
const latLongRes = midpoint(start.latitude, end.latitude, start.longitude, end.longitude, latLong);
// 最后加入终点
latLong.push(end);

console.log("latLongRes", latLongRes);

function midpoint(x1, x2, y1, y2, latLong) {
    // 计算线段长度
    const stepX = Math.pow(x2 - x1, 2);
    const stepY = Math.pow(y2 - y1, 2);
    const distance = Math.sqrt(stepX + stepY);

    if (distance > 0.1) {
        // 计算当前线段的中点
        const [midX, midY] = computeMidpoint(x1, x2, y1, y2);
        // 先递归细分左半段:从起点到中点
        midpoint(x1, midX, y1, midY, latLong);
        // 将当前中点加入序列
        latLong.push({ latitude: midX, longitude: midY });
        // 再递归细分右半段:从中点到终点
        midpoint(midX, x2, midY, y2, latLong);
    }

    // 关键:每次递归都返回数组,确保上层调用能拿到结果
    return latLong;
}

function computeMidpoint(x1, x2, y1, y2) {
    return [(x1 + x2) / 2, (y1 + y2) / 2];
}

核心修正说明

  • 补全递归返回值:在midpoint函数末尾始终返回latLong数组,不管是否进入递归分支,这样上层调用就能拿到处理后的完整数组,不会再返回undefined。
  • 完整收集所有点:初始数组先加入起点,递归过程中插入所有细分的中点,最后手动加入终点,保证序列包含起点、所有中点和终点,和你期望的结构一致。
  • 调整中点顺序:先递归左半段,再插入当前中点,最后递归右半段,这样生成的点顺序完全符合你给出的例子:从起点开始,逐步向终点细分插入中点。
  • 代码优化:用数组解构简化中点的接收,用Math.pow计算平方,代码更简洁易读。

测试结果

运行这段代码后,你会得到完全符合预期的坐标序列:
(5,4) → (5.75,4.75) → (6.125,5.125) → (6.5,5.5) → (6.875,5.875) → (7.25,6.25) → (8,7)

内容的提问来源于stack exchange,提问作者Sadikhasan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:53:04