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

递归实现网页矩形尺寸设计遇问题,求代码解析与条件说明

矩形尺寸设计递归代码问题解析

一、你的递归代码存在的核心问题

你的代码会直接触发无限递归栈溢出,原因如下:

  1. 递归逻辑完全错误:每次递归时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的终止条件,导致递归无限进行。
  2. 无效代码: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:57:34