算法通关村-----一图理解递归

递归的本质

递归的本质是方法调用,自己调用自己,系统为我们维护了不同调用之间的保存和返回功能。

递归的特征

执行范围不断缩小,这样才能触底反弹

终止判断在递归调用之前

如何写递归

以n的阶乘为例

第一步 从小到大递推

n=1 f(1)=1

n=2 f(2) = 2*f(1)=2

n=3 f(3) = 3*f(3)=6

...

f(n) = n*f(n-1)

第二步 分情况讨论 明确结束条件

当n=1时,f(n)=1

第三步 组合出完整方法

java 复制代码
public int f(n){
	if(n==1){
		return 1;
	}
	return n*f(n-1);
}

如何看懂递归代码

一图理解递归

链表反转

问题描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。详见leetcode206

问题分析

之前我们已经使用过两种方式来进行链表反转。分别是虚拟头节点的方式和直接反转的方式,链表反转也可以通过递归来实现

代码实现

直接反转

java 复制代码
public static LinkedNode reverse2(LinkedNode head){
    LinkedNode pre = null;
    LinkedNode current = head;
    while (current!=null){
        LinkedNode next = current.next;
        current.next = pre;
        pre = current;
        current = next;
    }
    return pre;
}

使用虚拟头节点进行反转

java 复制代码
public LinkedNode reverse(LinkedNode head){
    LinkedNode vhead = new LinkedNode(-1);
    vhead.next = head;
    LinkedNode current = head;
    while(current!=null){
        LinkedNode next = current.next;
        current.next = vhead.next;
        vhead.next = current;
        current = next;
    }
    return vhead.next;
}

使用递归进行反转

java 复制代码
public ListNode reverse(ListNode head) {
    if(head==null||head.next==null){
        return head;
    }
    ListNode node = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return node;
}
相关推荐
计算机小白一个40 分钟前
蓝桥杯 Java B 组之背包问题、最长递增子序列(LIS)
java·数据结构·蓝桥杯
MZWeiei1 小时前
PTA:运用顺序表实现多项式相加
算法
卑微的小鬼1 小时前
数据库使用B+树的原因
数据结构·b树
GISer_Jing1 小时前
Javascript排序算法(冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序)详解
javascript·算法·排序算法
cookies_s_s1 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
不想编程小谭2 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode
水蓝烟雨2 小时前
[HOT 100] 2187. 完成旅途的最少时间
算法·hot 100
醉城夜风~3 小时前
[数据结构]双链表详解
数据结构
菜鸟一枚在这3 小时前
深度解析建造者模式:复杂对象构建的优雅之道
java·开发语言·算法
gyeolhada4 小时前
2025蓝桥杯JAVA编程题练习Day5
java·数据结构·算法·蓝桥杯