深入理解递归思想

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
	}

猜你喜欢

转载自blog.csdn.net/qq_36719449/article/details/83034916
今日推荐