我觉得一开始理解递归是比较难的,特别是我们会习惯性的会将递归进行分解,当然这个也没有错,这会有助于我们去理解递归。
但是我觉得网上恶心的是什么呢?他们只会留下这么简单的一句:
要理解递归,请理解递归。
这句话谁都懂,对递归的概念其实大多数人也懂,但难懂的是如何去学会理解并使用递归。
于是我将我对递归中的一部分理解心得供大家慢慢参考。
本文将举出三个基本例子,这样也是一层一层的深入。
第一个例子是求阶乘,作为递归思维的饭前甜点
public class jiecheng { public static int jiecheng(int n) { if(n!=0) { return n*jiecheng(n-1);//在这里运用到了递归 }else {//当n=0时,就跳转到这里,直接结束 return 1; } } public static void main(String args[]) { int n=5;//求n的阶乘 System.out.println(jiecheng(n)); } }
我将调用的路径写一下
return 5*(return 4*(return 3*(return 2*(return 1*return(因为此时n=0,所以返回1) ) ) ) )=5*4*3*2*1*1;
现在大家是不是一目了然了,这是层层调用,最后止步于n=0,再层层返回
第二个例子是快速排序,快速排序我们经常用到,而且也是调用递归的一个典型例子
public class QuickSort { public static void quickSort(int s[],int low,int high) { if(low>high) { return; } int i=low,j=high; int key=s[low];//这里作为基准元素 while(i<j) { while(i<j&&key<=s[j]) { j--;//从高位扫描,如果发现高位存在比基准值低的,则跳出循环 } s[i]=s[j];//将该值赋值给低位的位置 while(i<j&&key>=s[i]) { i++;//同理从低位开始扫描,如果发现有低位存在比基准值高的,则跳出循环 } s[j]=s[i];//将该值赋给刚刚的高位扫描处,相当于围绕key进行了一个置换 }//最终,所有的值均围绕key值的大小排在了两边,显然,此时的i在值的中间位置,而不是空间上的中间位置,且此时i==j s[i]=key;//这个很重要,因为在第一次扫描后,是s[i]=s[j],时,s[i]的值已经更改,而是s[i]的初始值是s[i]=s[low]=key;所以在这一步进行还原 quickSort(s, low, i-1);//此处开始递归,将在下面进行解释 quickSort(s, j+1, high); } public static void main(String args[]) { int s[]= {4,6,9,2,7,5,0,8,3,1}; quickSort(s, 0, s.length-1); for(int i=0;i<s.length;i++) System.out.print(s[i]+" "); } }
如果有什么代码思路上的不懂(除了递归思路在下面解释),可以看注释,写得很详细
快速排序中的递归其实就相当于一个深度二叉树,找到叶子而叶子就是key为止,比如最先找到的是返回是是s[0]=4,然后找到key的顺序是1,0,2,3,5,6,7,8,9,实际上快排就是查找一个key的过程