递归获取两点间多个中点的实现及JavaScript代码调试求助
解决递归返回undefined问题,实现中点细分序列
我来帮你搞定这个递归函数返回undefined的问题,同时实现你想要的不断细分中点的需求。先看看你的代码问题出在哪,再给你修正后的完整实现。
问题根源分析
- 递归无返回值:当线段距离大于0.1时,你调用了两次递归,但没有返回处理后的
latLong数组,导致上层调用拿不到结果,最终返回undefined。 - 点收集不完整:当前终止条件只添加了
(x1,y1),会漏掉终点(x2,y2),而且初始调用时也没把起点加入数组,导致序列不完整。 - 中点顺序逻辑模糊:原递归逻辑没有明确的中点插入顺序,可能导致生成的点序列不符合你的预期。
修正后的完整代码
// 定义起点和终点 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
相关产品推荐
相关产品推荐

