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

递归的本质

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

递归的特征

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

终止判断在递归调用之前

如何写递归

以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;
}
相关推荐
NAGNIP8 小时前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队9 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja13 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下13 小时前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶13 小时前
算法 --- 字符串
算法
博笙困了14 小时前
AcWing学习——差分
c++·算法
NAGNIP14 小时前
认识 Unsloth 框架:大模型高效微调的利器
算法
NAGNIP14 小时前
大模型微调框架之LLaMA Factory
算法
echoarts14 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Python技术极客14 小时前
一款超好用的 Python 交互式可视化工具,强烈推荐~
算法