Java循环变量修改及内层j初始值调整的影响分析
问题解答
我来给你拆解这两个问题,结合你提供的FindNearestPoints代码详细说明:
问题1:当修改循环内的变量值时,会产生什么结果?
这个问题要分两种变量类型来看,影响完全不同:
修改循环控制变量(比如for循环中的
i、j):
这类变量是用来控制循环执行次数和遍历范围的核心,修改它们会直接打乱循环的原有逻辑。举个例子:- 如果在原代码的外层循环里突然把
i改成i = points.length,循环会直接提前结束,大量点对都没被计算; - 如果把
i改成i--,会导致循环陷入死循环,程序一直重复处理同一个元素。
除非你有特定的业务需求(比如动态调整遍历顺序),否则不建议随意修改循环控制变量。
- 如果在原代码的外层循环里突然把
修改循环内的业务变量(比如代码中的
shortestDistance、p1、p2):
这是实现业务逻辑的核心操作,完全合理。比如原代码中,每次计算出一对点的距离后,如果它比当前记录的最短距离更小,就更新shortestDistance和对应的点索引p1、p2——这正是我们找到“最近点”的关键步骤,属于正常的状态更新。
问题2:修改内层循环j的初始值,j=0或j=i分别有什么区别?
先看原代码的j=i+1:这么写是刻意设计的——既避免了重复计算同一对点(比如点(i,j)和(j,i)的距离完全相同,没必要算两次),又跳过了点到自身的无效计算(i=j时距离为0,对找“两个不同点”没有意义),能把计算量减少一半,效率更高。
现在看两种修改后的情况:
情况1:j=0
- 计算量翻倍,效率下降:每次外层循环
i,内层都会从0遍历到最后一个点,同一对点会被计算两次(比如i=0,j=1和i=1,j=0都会被处理)。当点的数量很多时,这个冗余计算会让程序运行明显变慢。 - 结果不符合预期:当
j=i时,会计算点到自身的距离(值为0),这个距离肯定比初始的shortestDistance小,所以程序会把shortestDistance更新为0,最终输出的“最近点”会是同一个点两次,这显然不是我们想要的“两个不同点”的结果。
情况2:j=i
- 仍会出现无效结果:同样会计算点到自身的距离(0),导致
shortestDistance被更新为0,最终输出同一个点,不符合需求。 - 仍有部分冗余计算:比如
i=1,j=2和i=2,j=1都会被计算,虽然比j=0的冗余少,但还是做了不必要的重复运算,效率远不如原代码的j=i+1。
原程序代码
import java.util.Scanner; public class FindNearestPoints { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Enter the number of points: "); int numberOfPoints = input.nextInt(); // Create an array to store points double[][] points = new double[numberOfPoints][2]; System.out.print("Enter " + numberOfPoints + " points: "); for (int i = 0; i < points.length; i++) { points[i][0] = input.nextDouble(); points[i][1] = input.nextDouble(); } // p1 and p2 are the indices in the points array int p1 = 0, p2 = 1; // Initial two points double shortestDistance = distance(points[p1][0], points[p1][1], points[p2][0], points[p2][1]); // Initialize shortestDistance // Compute distance for every two points for (int i = 0; i < points.length; i++) { for (int j = i + 1; j < points.length; j++) { double distance = distance(points[i][0], points[i][1], points[j][0], points[j][1]); // Find distance if (shortestDistance > distance) { p1 = i; // Update p1 p2 = j; // Update p2 shortestDistance = distance; // Update shortestDistance } } } // Display result System.out.println("The closest two points are " + "(" + points[p1][0] + ", " + points[p1][1] + ") and (" + points[p2][0] + ", " + points[p2][1] + ")"); } /** Compute the distance between two points (x1, y1) and (x2, y2)*/ public static double distance( double x1, double y1, double x2, double y2) { return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); } }
内容的提问来源于stack exchange,提问作者bufferoverflow
相关产品推荐
相关产品推荐

