递归的本质
递归的本质是方法调用,自己调用自己,系统为我们维护了不同调用之间的保存和返回功能。
递归的特征
执行范围不断缩小,这样才能触底反弹
终止判断在递归调用之前
如何写递归
以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;
}