版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36719449/article/details/83034916
1、什么是递归
本质上,将原来的问题转换为更小的同一问题。问题规模可以不断缩小,直到达到一个不能再缩小的基本问题,解决这个基本问题,就解决了整个问题。
例如,使用递归思想对自然数1、2、3…n-1 、n求和:
sum(n) = n +sum(n-1); //sum(n-1)就是被转换后规模更小的同一问题。
sum(n-1)=n-1 +sum(n-2)
…
sum(2)= 2 +sum(1) //直到问题不能再小 n=1 为止
代码的实现非常简单,一起来看看:
/**
* @author evan
*使用递归思想对自然数1、2、3...n求和
*/
public class Sum {
public static int sum(int n) {
if (n==1) {
return 1;
}
return n+sum(n-1);
}
public static void main(String[] args) {
System.out.println(sum(100));
}
}
2、编写递归程序的思路
编写递归程序的思路主要有两步:
1、求解 最基本的问题。
2、将原问题转换为更小的问题(难点)。
2.1、链表具有天然的递归结构
链表具有天然的递归结构,这是因为我们既可以将链表看做是一个个的元素节点挂载起来,也可以把整个链表看做是Node1元素节点挂载了一条以Node2为头节点的链表的链表。说起来 可能有点拗口 ,其实就是:
整条链表 = Node1节点 + 子链表(以Node2为头结点的链表)。
举例:利用递归删除链表中的元素。
public void remove(E e) {
solveRemove2(dummyHead ,e);
}
/**
* 用递归来删除链表中元素 写法二
* @param head 头结点
* @param e 要删除的值
* @return 删除后的链表,代表一条子链表
*/
private Node solveRemove2(Node head ,E e) {
if (head == null) {
return null;
}
head.next = solveRemove2(head.next, e);
return head.data==e ? head.next:head;
}