【唐叔学算法】第二天:探索递归的魅力

递归算法简介

递归算法是一种在解决问题时,将问题分解成更小的、相似的子问题来解决的方法。它是一种非常强大的编程技术,尤其适用于那些可以自然分解为相似子问题的场景。递归算法的核心思想是:问题可以分解为更小的相同问题,直到问题足够小以至于可以直接解决

如何使用递归算法

使用递归算法时,你需要定义两个关键部分:

  1. 基本情况(Base Case):这是递归停止的条件,防止无限递归。
  2. 递归步骤(Recursive Step):这是递归调用自己的过程,每次调用都应该向基本情况靠近。

递归算法的使用场景

递归算法适用于以下场景:

  • 树结构和图结构:如二叉树遍历、图的深度优先搜索(DFS)。
  • 分治算法:如归并排序、快速排序。
  • 动态规划问题:某些动态规划问题可以通过递归+记忆化的方式来优化。
  • 数学问题:如计算阶乘、斐波那契数列等。

LeetCode递归题目解析

入门难度:二叉树的前序遍历(题号:144)

题目链接LeetCode 144. Binary Tree Preorder Traversal

解题思路:前序遍历的顺序是:根节点 -> 左子树 -> 右子树。我们可以递归地遍历左子树和右子树。

Java代码示例

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null) return result;
        result.add(root.val);
        result.addAll(preorderTraversal(root.left));
        result.addAll(preorderTraversal(root.right));
        return result;
    }
}

中等难度:组合总和(题号:39)

题目链接LeetCode 39. Combination Sum

解题思路:我们需要找出所有可能的组合,使得它们的和等于目标值。对于每个数字,我们可以选择包含它或不包含它,然后递归地处理剩余的数字。

Java代码示例

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        backtrack(candidates, target, 0, new ArrayList<>(), result);
        return result;
    }

    private void backtrack(int[] candidates, int target, int start, List<Integer> current, List<List<Integer>> result) {
        if (target == 0) {
            result.add(new ArrayList<>(current));
            return;
        }
        for (int i = start; i < candidates.length; i++) {
            if (candidates[i] > target) break;
            current.add(candidates[i]);
            backtrack(candidates, target - candidates[i], i, current, result);
            current.remove(current.size() - 1);
        }
    }
}

更多递归题目

以下是一些可以使用递归算法解答的LeetCode题目:

递归算法是一种强大且优雅的解决问题的方法,希望这篇文章能帮助你更好地理解和应用递归。记得在实际编程中,递归可能会导致栈溢出,所以合理使用递归,并考虑使用迭代或尾递归优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值