Gemini永久会员 Java实现的暴力递归版本

以下是Java实现的暴力递归版本,对应Go动态规划示例中的几个经典问题。暴力递归通常是最直观的解法,但效率较低,适合用来理解问题本质,之后可以优化为动态规划。


1. 斐波那契数列(暴力递归)

java 复制代码
public class Fibonacci {
    // 暴力递归实现(效率低,存在大量重复计算)
    public static int fibRecursive(int n) {
        if (n <= 1) {
            return n;
        }
        return fibRecursive(n - 1) + fibRecursive(n - 2);
    }

    public static void main(String[] args) {
        int n = 10;
        System.out.println("斐波那契数列(暴力递归): " + fibRecursive(n));
    }
}

2. 0-1背包问题(暴力递归)

java 复制代码
public class Knapsack {
    // 暴力递归实现
    public static int knapsackRecursive(int[] weights, int[] values, int capacity, int index) {
        if (index == weights.length || capacity == 0) {
            return 0;
        }
        // 不选当前物品
        int maxValue = knapsackRecursive(weights, values, capacity, index + 1);
        // 选当前物品(如果容量允许)
        if (weights[index] <= capacity) {
            maxValue = Math.max(maxValue, 
                values[index] + knapsackRecursive(weights, values, capacity - weights[index], index + 1));
        }
        return maxValue;
    }

    public static void main(String[] args) {
        int[] weights = {2, 3, 4, 5};
        int[] values = {3, 4, 5, 6};
        int capacity = 8;
        System.out.println("背包最大价值(暴力递归): " + 
            knapsackRecursive(weights, values, capacity, 0));
    }
}

3. 最长公共子序列(LCS,暴力递归)

java 复制代码
public class LCS {
    // 暴力递归实现
    public static int lcsRecursive(String text1, String text2, int i, int j) {
        if (i == text1.length() || j == text2.length()) {
            return 0;
        }
        if (text1.charAt(i) == text2.charAt(j)) {
            return 1 + lcsRecursive(text1, text2, i + 1, j + 1);
        } else {
            return Math.max(
                lcsRecursive(text1, text2, i + 1, j),
                lcsRecursive(text1, text2, i, j + 1)
            );
        }
    }

    public static void main(String[] args) {
        String text1 = "abcde";
        String text2 = "ace";
        System.out.println("LCS长度(暴力递归): " + lcsRecursive(text1, text2, 0, 0));
    }
}

4. 硬币找零问题(暴力递归)

java 复制代码
import java.util.Arrays;

public class CoinChange {
    // 暴力递归实现(返回最少硬币数)
    public static int coinChangeRecursive(int[] coins, int amount, int index) {
        if (amount == 0) {
            return 0;
        }
        if (index == coins.length || amount < 0) {
            return -1; // 无解
        }
        // 不选当前硬币
        int res = coinChangeRecursive(coins, amount, index + 1);
        // 选当前硬币
        int next = coinChangeRecursive(coins, amount - coins[index], index);
        if (next != -1) {
            res = (res == -1) ? next + 1 : Math.min(res, next + 1);
        }
        return res;
    }

    public static void main(String[] args) {
        int[] coins = {1, 2, 5};
        int amount = 11;
        System.out.println("最少硬币数(暴力递归): " + 
            coinChangeRecursive(coins, amount, 0));
    }
}

暴力递归的缺点

  1. 重复计算 :如斐波那契数列中,fib(n-2)会被计算多次。
  2. 效率低:时间复杂度通常是指数级(如背包问题为O(2^n))。
  3. 栈溢出风险:递归深度过大时可能导致栈溢出。

优化方向

这些暴力递归解法可以通过记忆化搜索 或动态规划优化,避免重复计算。例如:

  • 斐波那契数列可以用缓存存储中间结果。
  • 背包问题可以用二维数组保存子问题的解。

如果需要这些问题的Java动态规划实现,可以进一步补充!

相关推荐
时间静止不是简史4 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428047 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
徐小夕9 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao9 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
金銀銅鐵9 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工10 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
小豆庄10 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
catoop10 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
星夜离尘5610 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
system_error_x10 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端