递归算法十分重要,它的主要思想就是将重复的大问题化为单个最小问题,通过调用自身函数来解决,主要有两个过程:“递”与“归”,以及递归的终止条件。
例1:
LeetCode206
1 public static ListNode reverseList(ListNode head) {
2 if(head==null||head.next==null){ //递归终止条件
3 return head;
4 }
5 ListNode next=head.next; //向后走操作
6 ListNode newHead=reverseList(next); //递归入口
7 next.next=head; //逐步反转
8 head.next=null;
9 return newHead;
2 if(head==null||head.next==null){
3 return head;
4 }
5 ListNode next=head.next;
6 ListNode newHead=reverseList(next);
程序开始时,从if进,不符合其中的条件,继续向下到第五行next=next.next,使得结点在链表中向后走,直到第6行;第6行开始调用自身(即为"递"的过程),
if(head==null||head.next==null){ //递归的终止条件
return head; //开始"归"的过程
}
接下来开始执行7到9行,直到"归"到 第一次调用时
每一次"归"的过程都会执行7、8行代码,即进行反转操作,直到"归"到第一次调用时,"递归整体结束,链表也反转完毕" ,再返回新的头结点,至此该算法整个执行完。
例2:
杨辉三角
//该算法是基于将杨辉三角分割为一半编写的
1 public static int getV(int x,int y){
2 if(y<=x&&y>=0){
3 if(y==0||x==y){ //"递"的终止条件
4 return 1; //"归"的开始
5 }
6 else {
7 return getV(x-1,y-1)+getV(x-1,y); //"递"的入口
8 }
9 }
10 return -1; //失败则返回-1
11 }
可以将此三角型看作一个数字矩阵:
若查找的值在对角线直接返回1,否则进行第7行,开始"递",当满足条件时,开始"归",直到回到第一次调用。