递归
函数直接或间接地调用自己。
生活中的例子
从前有座山的故事。
从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事:从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事:。。。
4个要素
接受的参数
返回值
递归终止条件
递归拆解:如何递归到下一层
斐波拉契数列
0,1,1,2,3,5,8…
f(n) = f(n - 1) + f(n - 2),其中f(0) = 0,f(1) = 1
recursion(int n) {
if(n < 2)
return n == 1 ? 1 : 0;
return recursion(n - 1) + recursion(n - 2);
}
空间复杂度是O(N),因为递归使用了递归栈来存储,一层一层向下递归,遇到终止条件后又一层一层向上返回,最底层的元素相当于是最后进栈的,但是最先返回,所以是先进后出。最上层的n会被一层一层分解直到1,每一层相当于是n-1,所以递归高度为n,而递归栈的空间复杂度是递归的高度,也就是O(N)。
递归相关leetcode
No.509 斐波那契数
思路:当n为0和1时,递归终止,返回0和1。否则将n拆解为fib(n)拆解为fib(n-1)和fib(n-2)返回。
class Solution {
public int fib(int n) {
if(n < 2)
return n == 1 ? 1 : 0;
return fib(n - 1) + fib(n - 2);
}
}
No.206 反转链表
思路:
判断head节点是否为空或head的下一个节点是否为空,是则表示链表为空或当前节点是链表最后一个节点,返回head。
递归调用本函数直到链表的最后一个节点,即满足上面的条件,返回链表的最后一个节点5到新链表result中,此时head指针指向的是节点4,将节点4的下一个节点5的next指向节点4,将节点4的next指向null,返回包含节点4和节点5的链表到新链表result中,此时head指针指向的是节点3,将节点3的下一个节点4的next指向节点3,将节点3的next指向null,返回包含节点3,4,5的链表到新链表result中,以此类推,直到返回的result包含2,3,4,5,此时头节点指向1,将1的下一个节点2的next指向1,将1的next指向null,返回包含节点1,2,3,4,5的反转之后的链表。
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode result = reverseList(head.next);
head.next.next = head;
head.next = null;
return result;
}
}