1.定义:
递归方法:一个方法体内调用它自身

2.如何理解递归方法?
方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无循环控制。
递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。

3.举例:

//例题1:计算1-100之间的所有的自然数和
int sum = 0;
for(int i = 0;i < 100; i++){
  sum += i;
}
System.out.println("总和为:" + sum );
System.out.println("***************");

//方法二:调用使用递归方法;
RacursionTest test = new RacursionTest();
int sum1 = test.getSum1(100);
System.out.println(sum1);
System.out.println("****************");

//测试例题3:
int value = test.f(10);
System.out.println(value);
System.out.println("*****************");

//测试例题4:
//方法一:
int fib = test.Fibonacci(5);

//方法三:
long fib3 = test.Fibonacci(3);  //[1,1,2]
System.out.println(fib3);    //2
}

//例题1:递归。  计算1-100之间的所有自然数
public int getSum(int num){
  if(num == 1){
    return 1;
  }else {
    return num + getSum(num - 1);
  }

}

//例题2:计算1-100之间所有的自然数乘积    //n!= n * (n-1) * (n-2) * ... * 2 * 1;
public int getSum1(int num){
  if(num == 1){
    return 1;
  }else {
    return num * getSum1(num - 1);
  }

}

//例题3: 已知有一个数列:f(0) = 1, f(1) = 4, f(n+2) = 2*f(n+1) + f(n);
public int f(int n){
  if(n == 0){
    return 1;
  }else if(n == 1){
    return 4;
  }else {
    return 2*f(n-1) + f(n-2);
  }

}

//例题4:斐波那契数列
/*
 * 输入一个数据n,计算斐波那契数列(Fibonacci)的第n个的值
 * 1 1 2 3 5 8 13 21 34 55
 * 规律:一个数等于前两个数之和
 * 要求:计算斐波那契数列的第n个值,并将其数列打印出来
 */
//方法一:
public int Fibonacci(int n){
  if(n == 1 || n == 2){
    return  1;
  }else if(n > 2){
    return Fibonacci(n-1) + Fibonacci(n-2);
  }else{
    return -1;
  }

}

//方法二: 通过for循环实现
public long Fibonacci2(int n ){
  if(n < 1){
    return -1;
  }else if(n == 1 || n == 2){
    return 1;
  }
  
  long a = 1l, b = 1l, c = 0l;
  for(int = 2; i < n;i++){
  c = a + b;      //第3个数的值等于前两个数的和
  a = b;          //第2个数的值赋给第1个数
  b = c;          //第3个数的值赋给第2个数,作为下次循环的基础

  }
return c;
}

//方法三:通过for循环和数组的方式实现
public long Fibonacci3(int n){
  if(n < 1){
    return -1;
  }else if(n == 1 || n == 2){
    return 1;
  }
  long[] arr = new long[n];
  arr[0] = arr[1] = 1;
  for(int = 2; i < n; i++ ){
  arr[i] = arr[i-1] + arr[i-2];
  }
  //可以得到整个的数列数据 仅n > 2
  System.out.println(Arrays.toString(arr));
  return arr[n-1];
}

//例题5:汉诺塔问题

public class TxGame1 {
    /**
     * 一共走了多少步
     */
    static int times;
 
    public static void main(String[] args) {
        char A = 'A';
        char B = 'B';
        char C = 'C';
        System.out.println("汉诺塔游戏开始啦");
        System.out.println("请输入盘子数:");
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        //调用汉诺塔
        hannoi(n, A, B, C);
        s.close();
 
    }
    /**
     * 盘子移动
     * @param disk
     * @param M
     * @param N
     */
    public static void move(int disk, char M, char N ){
        System.out.println("第"+(++times)+"次移动, 盘子"+disk+ "  "+M+"------->"+N);
    }
 
 
    public static void hannoi(int n, char A, char B, char C){
        if(n == 1){
            move(n, A, C);
        }else{
            //移动上一关的步骤移动到B
            hannoi(n - 1, A, C, B);
            //把最大的盘子移动C塔
            move(n, A, C);
            //再把B上的上一关的盘子移动到C上就可以了
            hannoi(n - 1, B, A, C);
 
        }
    }
}

//例题6:快排

public class QuickSort {
    public static void quickSort(int[] arr,int low,int high){
        int i,j,temp,t;
        if(low>high){
            return;
        }
        i=low;
        j=high;
        //temp就是基准位
        temp = arr[low];
 
        while (i<j) {
            //先看右边,依次往左递减
            while (temp<=arr[j]&&i<j) {
                j--;
            }
            //再看左边,依次往右递增
            while (temp>=arr[i]&&i<j) {
                i++;
            }
            //如果满足条件则交换
            if (i<j) {
                t = arr[j];
                arr[j] = arr[i];
                arr[i] = t;
            }
 
        }
        //最后将基准为与i和j相等位置的数字交换
         arr[low] = arr[i];
         arr[i] = temp;
        //递归调用左半数组
        quickSort(arr, low, j-1);
        //递归调用右半数组
        quickSort(arr, j+1, high);
    }
 
 
    public static void main(String[] args){
        int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
        quickSort(arr, 0, arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

标签智能推荐:

Python数据分析与数据挖掘

第一阶段:基础入门第一章:第二章:第三章:第四章:第二阶段:数理图形第五章:第六章:第七章:第八章:第三阶段:算法模型第九章:

Python从入门到放弃

目录第一章Markdown编辑器第二章计算机基础知识第三章进入python世界(基础)第四章面向对象编程第五章网络编程第六章并发编程第七章Python优酷项目第八章配置项目环境第一章Markdown编辑器第二章计算机基础知识第三章进入python世界(基础)第四章面向对象编程第五章网络编程第六章并发编程第七章Python优酷项目第八章配置项目环境

MySQL通用编程

第一阶段:基础入门第一章:第二章:第三章:复杂查询第四章:权限控制第五章:查询优化第二阶段:模型设计第六章:设计选择第七章:函数依赖第八章:分解算法第九章:设计过程第十章:数据建模第三阶段:事务管理第四阶段:数据恢复第五阶段:分布架构

计算机基础与操作系统

第一章:计算机系统简介第二章:计算机基础知识第三章:计算机的发展史及多道技术第四章:计算机网络知识简单介绍第五章:Windows系统,Mac系统与Linux系统的的安装与简介第六章:服务器硬件基础第七章:Linux发展史第八章:Linux服务器远程登录第九章:Linux常用的150个命令汇总

《Essential C++》读书笔记 之 目录导航

《EssentialC++》读书笔记之目录导航2014-07-06第一章:《EssentialC++》读书笔记之C++编程基础第二章:《EssentialC++》读书笔记之面向过程编程风格第三章:《EssentialC++》读书笔记之泛型编程风格第四章:《EssentialC++》读书笔记之基于对象编程风格第五章:《EssentialC++》读书笔记之面向对象编程风格第六章:以templae进行编

学习进度第二次报告

学习课程以及部分学习知识总结:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我的目标计划:通过学习CSS基础知识,准备对我之前写的一些网页进行精细修饰。然后再去B站以及CSDN等技术网站上多找找关于网页修饰这一类的课程和视频,为后面的第四章网站制作流程打好良好的基础,做好充足的准备。当前不足:代码编写还是不是很熟练,自己练习的实例还是过于稀少了,还需要花时间去多练习。&nbsp;

中国近现代史纲要--简答2

第三章辛亥革命与君主专制制度的终结&nbsp;第四章开天辟地的大事变第五章中国革命的新道路&nbsp;

2021-2022-1学期 20212308王献策 《网络空间安全专业导论》第二周学习总结

学习中的收获1.概述在经过全景图的认知和信息层学习的基础上,硬件层的学习让我了解了计算机时如何凭借基础硬件原件控制电流从而使用电信号来表示和操作这些二进制的。第四章的学习中,我知道了计算机如何通过控制最底层的电流进行运算;更深刻的认识到与十进制相比二进制计算机运算的明显的优越性。具体来说,电流由称为门的电子设备操纵,门负责执行基本操作运算如:非运算、与运算、或运算。把一个门的输出作为另一个门的输入

设计模式

目录第一章设计模式概述第二章UML第三章创建型模式5种第四章结构型模式7种敬请期待-更新中🐤

Web前端入门知识

第一阶段:理论知识第一章:第二阶段:了解知识第二章:第三阶段:入门知识第三章:第四章:第四阶段:样式搭配第五章:第六章:第七章: