递归实现网页矩形尺寸设计遇问题,求代码解析与条件说明
矩形尺寸设计递归代码问题解析
一、你的递归代码存在的核心问题
你的代码会直接触发无限递归栈溢出,原因如下:
- 递归逻辑完全错误:每次递归时
W = a / L + 1的计算毫无依据,比如输入20时,初始L=4、W=4,第一次递归后L=5,W=20/4+1=6,此时56=30≠20;第二次递归L=6,W=20/5+1=5,65=30≠20;后续L不断增大,W的计算完全偏离正确方向,永远无法满足L*W == a的终止条件,导致递归无限进行。 - 无效代码:
Math.round(W);这行没有赋值给任何变量,完全是多余操作,对程序逻辑没有任何影响。
二、为什么需要添加L>=W的判断
你认为W不可能大于L,但实际你的代码会直接出现W>L的情况:比如输入20的第一次递归,L=5,W=6,此时W>L,违反了题目要求的L>=W规则。即使修正递归逻辑,也需要这个判断来保证返回结果符合题目要求——比如当我们从平方根向下遍历找因数时,可能会出现找到的因数作为L时对应的W更大,这时候需要交换两者顺序,确保L始终大于等于W。
三、修正后的实现思路(含递归版本)
正确的逻辑应该是从目标面积的平方根开始,向下遍历找第一个能整除面积的整数,这个数就是W,对应的L就是面积除以W(保证L>=W且差值最小)。递归版本可以这样写:
import java.util.Arrays; public class Main { public static void main(String[] args) { System.out.println(Arrays.toString(constructRectangle(20))); } public static int[] constructRectangle(int a) { int start = (int) Math.sqrt(a); return findDimensions(a, start); } public static int[] findDimensions(int a, int w) { // 当w小于1时,说明是质数,L=a,W=1 if (w < 1) { return new int[]{a, 1}; } // 找到能整除的w,计算对应的L if (a % w == 0) { int l = a / w; // 确保L>=W,返回正确顺序 return l >= w ? new int[]{l, w} : new int[]{w, l}; } // 向下遍历下一个数 return findDimensions(a, w - 1); } }
这个递归版本从平方根开始向下找,一旦找到能整除的数就返回,保证了L和W的差值最小,同时通过判断确保L>=W。
内容的提问来源于stack exchange,提问作者AdHass
相关产品推荐
相关产品推荐

