关于递归的初级理解

我觉得一开始理解递归是比较难的,特别是我们会习惯性的会将递归进行分解,当然这个也没有错,这会有助于我们去理解递归。

但是我觉得网上恶心的是什么呢?他们只会留下这么简单的一句:

要理解递归,请理解递归。

这句话谁都懂,对递归的概念其实大多数人也懂,但难懂的是如何去学会理解并使用递归。

于是我将我对递归中的一部分理解心得供大家慢慢参考。

本文将举出三个基本例子,这样也是一层一层的深入。

第一个例子是求阶乘,作为递归思维的饭前甜点

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的过程

posted @ 2018-04-06 11:51  沉默的赌徒  阅读(227)  评论(0编辑  收藏  举报