使用递归只需要关注两个方面:
1、递归的最后一步需要做什么,比如返回一个什么样的值
2、读懂递归函数的含义,想想第一步怎么用已有的参数结合后续递归函数返回的值来得到想要的结果。
只要写这两步,不需要明白递归函数内部如何操作,即可完成递归。
比如:
//查询根节点为root的树中是否包含e,递归
private boolean contains(Node node, E e) {
if (node.e == null) {
return false;
}
if (e.compareTo(node.e) == 0) {
return true;
} else if (e.compareTo(node.e) < 0) {
return contains(node.left, e);
} else {
return contains(node.right, e);
}
}
//前序遍历根节点为node的树
private void preOrder(Node node) {
if (node == null) {
return;
}
System.out.println(node.e);
preOrder(node.left);
preOrder(node.right);
}
//递归获取反转链表的头节点
public Node reverse1(Node head){
if(head == null || head.next == null){//当链表为空或递归到了最后一层时
return head;
}
Node last1 = reverse1(head.next); //递归
head.next.next = head; //改变head后一位的指向
head.next = null; //改变head的指向
return last1; //返回反转后的链表首位
}