1.定义:方法调用自身。递归算法可以缩小规模,递归方法调用自身,但是参数不一样。递归可以用循环(递推,迭代)或者栈来代替
2.递归三要素:边界条件,递归关系式,参数返回值(递归方法,参数不一样)
3.递归算法的时间复杂度
(1)递归算法的时间复杂度= 递归的次数 * 每次递归的时间复杂度
递归次数和递归深度有关,递归次数就是递归二叉树的节点个数
(2)很多时候,递归可以抽象成一棵二叉树,时间复杂度和二叉树的节点个数有关(递归的次数就是节点的个数)
满二叉树节点个数:2n-1(n代表层数)第i层有:2i-1个节点
(3)不要一看到递归就想到O(logn)
4.递归算法的空间复杂度
(1)递归算法的空间复杂度 = 递归深度 * 每次递归的空间复杂度
(2)空间复杂度与递归的深度有关:递归深度就是调用栈的深度,就是递归二叉树的深度
5.递归的每个方法(每次递归)都有自己独立的变量。对于所有递归都操作的同一个变量(共享变量),应该放在递归方法外面。(二叉树递归遍历)
6.经典递归案例:(1)求阶乘(2)求x的n次方(3)斐波那契
7.空间复杂度:O(1),O(n)比较多。在递归的时候,会出现O(logn)的空间复杂度
8.递归方法的归就是迭代方法的迭代
9.递归是用栈实现的
10.递归遍历二叉树是,List<Integer>是共享变量,要放在参数中
1.二分查找
(1)非递归实现

1 public static int binarySerach(int[] arr,int key) {
2 int left=0;
3 int right=arr.length-1;
4
5 while(left<=right) {
6 int mid=(left+right)/2;
7 if(key==arr[mid])
8 return mid;
9 if(key<arr[mid])
10 right=mid-1;
11 if(key>arr[mid])
12 left=mid+1;
13 }
14 return -1;
15 }
(2)递归实现

1 public static int binarySerach(int[] arr,int key,int left,int right) {
2 int mid=(left+right)/2;
3
4 if(left>right)
5 return -1;
6 if(key==arr[mid])
7 return mid;
8
9 if(key<arr[mid])
10 return binarySerach(arr, key, left, mid-1);
11
12 if(key>arr[mid])
13 return binarySerach(arr, key, mid+1, right);
14 return -1;
15
16 }
2.汉诺塔问题

1 public static void move(int dish,String from,String temp,String to) {
2 if(dish==1)
3 System.out.println("将盘子"+dish+"从塔座"+from+"移动到目标塔座"+to);
4 else {
5 move(dish-1, from, to, temp);////A为初始塔座,B为目标塔座,C为中介塔座
6 System.out.println("将盘子"+dish+"从塔座"+from+"移动到目标塔座"+to);
7 move(dish-1, temp, from, to);//B为初始塔座,C为目标塔座,A为中介塔座
8 }
9 }
3.归并排序
4.消除递归
5.递归的有趣应用
(1)求一个数的乘方
(2)背包问题
(3)组合:选择一支队伍
补充:
1.尾递归:只有递,没有归(或者说:只有归,没有递)。和迭代一样
5852

被折叠的 条评论
为什么被折叠?



