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

递归的本质

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

递归的特征

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

终止判断在递归调用之前

如何写递归

以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;
}
相关推荐
?abc!1 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存
BioRunYiXue1 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学
jiunian_cn2 小时前
【c++】异常详解
java·开发语言·数据结构·c++·算法·visual studio
工藤新一¹3 小时前
蓝桥杯算法题 -蛇形矩阵(方向向量)
c++·算法·矩阵·蓝桥杯·方向向量
Levin__NLP_CV_AIGC3 小时前
解决pip安装PyPI默认源速度慢
算法·pip
康康这名还挺多4 小时前
鸿蒙HarmonyOS list优化一: list 结合 lazyforeach用法
数据结构·list·harmonyos·lazyforeach
Helibo444 小时前
GESPC++六级复习
java·数据结构·算法
EnticE1524 小时前
[高阶数据结构]二叉树经典面试题
数据结构·算法·面试
MarkHard1235 小时前
Leetcode (力扣)做题记录 hot100(34,215,912,121)
算法·leetcode·职场和发展
_星辰大海乀6 小时前
数据库约束
java·数据结构·数据库·sql·链表