递归学习(一)

本文深入探讨了递归的概念,强调了终止条件的重要性,并通过汉诺塔问题和扁平化多级双向链表的实例来阐述递归的应用。递归是一种解决复杂问题的有效方法,通过将大问题分解为小问题进行解决。在汉诺塔问题中,递归用于移动盘子;而在链表扁平化问题中,递归用于重新组织链表结构。理解递归函数的功能而非其展开过程是关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.含义

递归,就是在运行的过程中调用自己。

二.模板及条件

public void function(参数0) {
    if (终止条件) {
        return;
    }
    function(参数1);
}

ps:1.注意终止条件要放调用之前,不然会报StackOverflowError。

2.递归是把一个大的问题细分为更小的子问题,是一个重复的过程,只需要知道递归函数的功能即可,不要把递归一层一层的拆开来想。

三.举例

1)汉诺塔

汉诺塔的原理就是借助一个柱子把盘子移动另一个柱子上面,所以程序分三步:

1,先把n-1个圆盘从A借助C成功的移动到B

2,然后再把第n个圆盘从A移动到C

3,最后再把n-1个圆盘从B借助A成功的移动到C。

//伪代码
1,hanoi(n-1, 'A', 'C', 'B')//借助B把A上的盘子移动到C

2,System.out.println("从" + A + "移动到" + C);

3,hanoi(n-1, 'B', 'A', 'C')

要清除各个参数的含义

(2)

(2)430. 扁平化多级双向链表 - 力扣(LeetCode) (leetcode-cn.com)

 

这题简单来说核心思路就是先把子指针全部接上去,再接next指针,用了两层递归。

/*
// Definition for a Node.
class Node {
    public int val;
    public Node prev;
    public Node next;
    public Node child;
};
*/

class Solution {
    Node p = new Node(0);
    public Node flatten(Node head) {
        dfs(head);
        if(head != null)
        head.prev = null;
        return head;
    }
    public void dfs(Node root){
        if(root == null)return;
        Node left = root.child;
        Node right = root.next;
        p.next = root;
        root.prev = p;
        p = root;
        dfs(left);
        root.child = null;
        dfs(right);
    }
}

注意终止条件放再函数最前面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值