数据结构-递归(一)
定义:
在计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集
递归遍历链表的例子:
1 2 3 4 5
| void f(Node node) { if(node == nu11){ return; f(node.next); }
|
说明:
自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是一样的(有规律的)
每次调用,函数处理的数据会较上次缩减(子集),而且最后会缩减至无需继续递归
内层函数调用(子集处理)完成,外层函数才能算调用完成
思路:
先递后归
例1:阶乘
1 2 3 4 5
| private static int factorial(int n) { if (n == 0) return 1; return n * factorial(n - 1); }
|
例2:倒序字符串
1 2 3 4 5
| private static void reversePrint(String str) { if (str.isEmpty()) return; System.out.println(str.charAt(str.length()-1)); reversePrint(str.substring(0, str.length()-1)); }
|
例3:二分查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private static int recursion(int[] arr, int target) { return recursionMain(arr, target, 0, arr.length - 1); }
private static int recursionMain(int[] arr, int target, int i, int j) { if (i > j) return -1;
int mid = (i + j) >>> 1;
if (target < arr[mid]) { return recursionMain(arr, target, i, mid - 1); } else if (arr[mid] < target) { return recursionMain(arr, target, mid + 1, j); } else { return mid; } }
|
例四:冒泡排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private static int[] bubbleMain(int[] arr, int j) { if (j == 0) { return arr; } int x = 0; for (int i = 0; i < j; i++) { if (arr[i] > arr[i + 1]) { int temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; x = i; } } bubbleMain(arr, x); return arr; }
|
例五:插入排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| private void InsertionSortMain(int[] arr, int low) { if (low == arr.length) { return; } int t = arr[low]; int i = low - 1; while (i >= 0 && arr[i] > t) { arr[i + 1] = arr[i]; i--; } arr[i + 1] = t; InsertionSortMain(arr, low + 1); }
|
1 2 3
| ps:如果插入值为 4 ↑ 这是插入位置,因为上一轮 arr = arr ,因此无须担心会有数据丢失
|
例六:斐波那契数列第N个数的值
1 2 3 4 5
| private static int f(int num) { if (num == 0) return 0; if (num == 1) return 1; return f(num - 1) + f(num - 2); }
|
ps : 调用程序次数也是斐波那契数列,具体公式为:
时间复杂度:Θ = 1.618^n