zoukankan      html  css  js  c++  java
  • 关于递归的初级理解

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

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

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

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

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

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

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

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

  • 相关阅读:
    使用eclipse创建maven+动态web的项目
    关于Maven项目build时出现No compiler is provided in this environment的处理
    spark日志输出
    spark并行度加载关系数据库
    【java记录】序列化拷贝
    客户端远程访问高可用(HA)hdfs
    spark算法
    算子的分类和 宽依赖算子、窄依赖算子
    单元测试junit使用
    spark1.x和spark2.x兼容Iterable和Iterator问题【未解决】
  • 原文地址:https://www.cnblogs.com/gambler/p/8727298.html
Copyright © 2011-2022 走看看