递归算法的理解
思想
1.首先递归是将一个有规律的大问题拆分成比它规模小的小问题,一直拆分到不能拆分为止。
例如非常经典的阶乘问题就可以使用递归的思想来进行解决。
比如:4!与3与2!与1!类似
使用代码实现思想:
public static int multipleByFactorial(int n){
return n* multipleByFactorial(n-1);
}
传入n(计算n的阶乘)
返回值是n*multipleByFactorial(int n)其中n传入的参数为n-1
第二次返回值是n * (n-1) * multipleByFactorial(int n)其中n传入的参数为n-2
第三次返回值是n * (n-1) * (n-2) * multipleByFactorial(int n)其中n传入的参数为n-2
以此类推可以得到第N次的返回值是
n * (n-1) * (n-2) * … * (n-(N-1))multipleByFactorial(int n)
2.但是我们要注意的是计算4的阶乘,拆分到1的阶乘就应该结束了
继续的0的阶乘,-1的阶乘不符合规范了,所以应该有一个终止条件:n等与1的时候就是最后一次拆分。
所以我们应该在代码里面加上终止条件
if (n==1){//终止条件
return 1;
}
当n等于1结束拆分
完整代码:
public static int multipleByFactorial(int n){
if (n==1){//终止条件
return 1;
}
return n* multipleByFactorial(n-1);
}
对于递归顺序的一些理解
我在学习归并和快速排序的时候遇到返回或者自身调用了不止一个自身方法的情况。
举个例子
public static void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left+right)/2;
mergeSort(arr,left,mid,temp);//左边进行分解
mergeSort(arr,mid+1,right,temp);//右边进行分解
}
}
归并算法中会有这样的代码片段,那么他的执行顺序是怎样的呢?
假设 left=0,right=7
进去的时候
第一次执行mergeSort(0,7)—>mid=3 (不考虑数组,只考虑传入的int参数)
第二次执行mergeSort(0,3)—>mid=1
第三次执行mergeSort(0,1)—>然后mid=0,不满足条件进入mergeSort(arr,mid+1,right,temp);
第四次执行mergeSort(1,1) —>也不满足条件,所以也不进入.
接下来执行谁呢?
第四次执行mergeSort(2,3)—>mid=2,不满足条件mergeSort(arr,left,mid,temp);
第五次执行mergeSort(4,7)—>mid=5
第六次执行mergeSort(4,5)—>mid=4,不满足条件进入mergeSort(arr,mid+1,right,temp);
第七次执行mergeSort(6,7)—>mid=6,不满足条件,结束.
这里就要用到栈的一些知识.
首先方法是要进栈的.
1.mergeSort(0,7)进栈,然后有两个函数
首先执行mergeSort(arr,left,mid,temp)
2.mergeSort(0,3)进栈,执行mergeSort(arr,left,mid,temp)
3.mergeSort(0,1)进栈,执行mergeSort(arr,left,mid,temp),执行完以后不满足条件执行第二个函数
4.mergeSort(2,3)进栈,执行mergeSort(arr,mid+1,right,temp),执行完后不满足条件结束执行
5.mergeSort(0,1)与mergeSort(2,3)出栈
6.mergeSort(4,7)进栈,然后执行mid=3时的第二个函数
7.mergeSort(4,5)进栈,执行mergeSort(arr,left,mid,temp),执行完以后不满足条件执行第二个函数
8.mergeSort(6,7)进栈,执行mergeSort(arr,mid+1,right,temp),执行完后不满足条件结束执行
9.mergeSort(4,5)与mergeSort(6,7)出栈
10.mergeSort(0,3)与mergeSort(4,7)出栈
至此left=0,right=7时整个函数执行完毕
11.mergeSort(0,7)出栈
总结
1.递归就是将一个问题划分成若干个子问题,需要有一个终止条件.
2.如果遇到多个返回或者自身调用了不止一个自身方法的情况时,将一个函数执行结束时,执行下一个函数,当所有函数执行完毕时,返回上一级判断是否还能执行下一个函数,直到全部无法满足条件后,结束.
ps:因为初学,所以只是自己的一些片面的理解,如果描述有错误或不妥,希望多多指正.❤.