1、提起链表,有一块非常重要的内容,就是递归,这是因为链表本身具有天然的递归性,同时,链表也是一种结构非常简单的数据结构,使得链表是一种非常好的来学习和研究递归这种逻辑机制的数据结构。
2、使用一个简单的案例,数组求和,使用递归算法进行计算。案例,如下所示:
1 package com.array; 2 3 /** 4 * 数组求和,使用递归算法进行计算。 5 * <p> 6 * 递归算法的基本原则。 7 * 1、第一部分,求解最基本的问题。 8 * 例如,return 0;递归算法就是将原问题变成了一个更小的问题, 9 * 更小的问题变成一个更更小的问题,以此类推,直到变成了一个最基本的问题,这个最基本的问题是不能自动求解的, 10 * 是需要我们编写逻辑进行求解的。这里对数组求和的算法就表现在if (left == arr.length) { return 0;},先判断 11 * 一下,我们当前真的是一个最基本的问题,是的话,直接返回retun 0; 12 * 2、第二部分,把原问题转化成更小的问题的这样一个过程。 13 * 通常,对于递归算法来说,最基本的问题都是极其简单的,甚至基本上都是这样的一种形式,直接return一个数就行了。 14 * 最基本的问题,一眼就可以看出答案是多少了,但是难得是如何把原问题转化成更小的问题呢,所谓的转化为更小的问题, 15 * 不是求一个更小的问题的答案就好了,是根据更小的问题的答案构建出原问题的答案。 16 * 这里面的构建就是让arr[left] + 更小的一段数组中所有的元素的和,那么,这个构建方式非常简单。 17 */ 18 public class ArraySum { 19 20 /** 21 * 数组求和,用户调用的公开方法。 22 * 23 * @param arr 24 * @return 25 */ 26 public static int sum(int[] arr) { 27 // 思路,一点一点缩小数组的大小,就是,数组从那里一直到数组的最后对数组进行求和。这些规模在一直减小。 28 // 调用私有的sum方法,将数组arr传入参数1,索引0位置传入参数2。 29 // 参数2传入的是0,是递归的初始调用,计算的是从0一直到n-1这些元素所有的和。 30 return sum(arr, 0); 31 } 32 33 /** 34 * 递归算法,对用户屏蔽的私有方法。 35 * <p> 36 * 私有的函数,计算arr[left...n)这个区间内所有数字的和。即left到n-1这些索引区间的和。 37 * 38 * @param arr 数组 39 * @param left 左边界的点,其实是一个索引 40 * @return 41 */ 42 private static int sum(int[] arr, int left) { 43 // 首先判断,left等于数组长度的时候,说明递归到了最后 44 if (left == arr.length) { 45 // 此时,整个数组为空的时候,直接返回0即可 46 return 0; 47 } else { 48 // 否则,返回arr[left] + sum(arr, left + 1)。 49 // 取出,现在要计算出从left到n-1这些索引的所有元素的和。 50 // 把左边的元素单独拿出来,就是arr[left],再加上sum,对arr的从left + 1这个索引,一直到n-1这个索引。 51 // 这些范围里面的所有元素进行求和操作。sum(arr, left + 1)就是递归调用的过程。 52 return arr[left] + sum(arr, left + 1); 53 // 我们计算从left到n这个区间范围内的所有元素的和,变成了计算从left+1到n所有数字的和。 54 // 我们解决的这个问题,规模变小了,直到最终left和数组的长度相等的时候,也就是要求一个空数组的和。 55 } 56 } 57 58 public static void main(String[] args) { 59 int[] arr = new int[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9}; 60 int sum = ArraySum.sum(arr);