java中递归实例

简介: java中递归实例

前言

许多人对于递归觉得难以理解,其实最主要的原因还是自己少做少练了,今天小编就给大家带来一些经典的递归实例,希望有助于大家提高对代码的理解力。喜欢的朋友可以点赞留言哦,促进小编的进步!

一 阶乘问题

求n的阶乘

import java.util.Scanner;
 
public class demoone {
    public static void main(String[] args) {
        // 递归求 N 的阶乘
        Scanner sc = new Scanner(System.in);//从键盘读取一个数
        int a = sc.nextInt();//将该数放入一个变量里面
        int ret = jiecheng(a);//定义一个变量用于接收返回值
        System.out.println(ret);
    }
    public static int jiecheng(int n){
        if(n==1){
            return 1;//这就是一个趋于终止的条件
        }else{
            return n*jiecheng(n-1);//这里就是使用递归,一直去调用自己
        }
    }
}

二 求和问题

递归求1+2+3+……+n的和

import java.util.Scanner;
 
public class demoone {
    //实现代码: 递归求 1 + 2 + 3 + ... + n
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        System.out.println(sum(a));
    }
    public static int sum(int n){
        if(n==1){
            return 1;
        }else{
            return n+sum(n-1);
        }
    }
}

三 打印数字问题

import java.util.Scanner;
 
public class demoone {
    // 实现代码: 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
         printnum(a);
    }
    public static void printnum(int n){
        if(n<10){
           System.out.print(n+" ");//不换行输出,空格隔开,以示区别
        }else{
            printnum(n/10);
            System.out.print(n%10+" ");//不换行输出,空格隔开,以示区别
 
        }
    }
}

四 求每个位数相加问题

例:输入1234 结果:10(1+2+3+4)

import java.util.Scanner;
 
public class demoone {
    //5. 实现代码: 写一个递归方法,输入一个非负整数,返回组成它的数字之和.
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int a = sc.nextInt();
       int ret =  sumprint(a);
       System.out.println(ret);
    }
    public static int sumprint(int n){
        if(n<10){
            return n;
        }else{
 
            return  sumprint(n/10)+n%10;
        }
    }
}

五 斐波那契数列

法一(不推荐):这里会有一个明显的缺点,就是当数字越来越大的时候,我们的运算速度就明显会变慢,这不会是我们想要的结果,所以这种方法我们了解就可以,不推荐使用这个方法。

import java.util.Scanner;
 
public class demoone {
    //斐波那契数列
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int a = sc.nextInt();
        System.out.println(fib(a));
 
    }
    public static int fib(int n){
        if(n==1||n==2){
            return 1;
        }else{
            return fib(n-1)+fib(n-2);//斐波那契数列的特点,后一项等于前两项的和,这个就是从后往前推的一个思路
        }
    }
}

法二(迭代循环,极力推荐)

import java.util.Scanner;
 
public class demoone {
    //斐波那契数列
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int a = sc.nextInt();
        System.out.println(fib(a));
 
    }
    public static int fib(int n){
        if(n==1||n==2){
            return 1;
        }
        int b = 1;
        int c = 1;
        int d = 0;
        for(int i = 3;i<=n;i++){//迭代循环,这里利用循环迭代,从前面加到后面,减少了很多运算量,大大提高运算效率
            d = b+c;
            b=c;
            c=d;
        }
        return d;
    }
}

六 经典问题:青蛙跳台阶问题

public class demoone {
    /*青蛙跳台阶问题:
    青蛙一次可以跳1个台阶,或者两个台阶,问此时跳n级台阶有几种跳法
    其实,遇到这种问题,我们先具体化分析,找出其中的规律。然后在进行
    编写程旭就会更简单了,首先青蛙跳1级台阶只有1种跳法,2级台阶有两种跳法
    ,3级台阶有3张跳法,4级台阶有5种跳法,那么这个时候规律就可以看出来了,也就是说青蛙
    跳3级台阶的跳法等于1级与2级的和,4级等于3级与2级的和。这样问题就被简化成一个斐波那契数列了
     */
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int b = sc.nextInt();
        System.out.println(frogdump(b));
    }
    public static int frogdump(int n){
        if(n==1||n==2){
            return n;
        }
        int a = 1;
        int b = 2;
        int c = 0;
        for(int i=3;i<=n;i++){
            c=a+b;
            a=b;
            b=c;
        }
        return c;
    }
}

七 经典问题:汉诺塔问题

public class qq {
    public static void main(String[] args) {
        hannio(3,'Q','W','R');
    }
    public static void move(char a,char b){
        System.out.print(a+"->"+b+" ");
    }
    /*
    这里的one代表的是初始第一根柱子
    two代表的是中转盘子的第二根柱子
    three代表的是目的柱子
     */
    public static void hannio(int n,char one ,char two,char three){
        if(n==1){
         move(one,three);//终止条件,只有一个盘子的时候,直接从第一个柱子拿到第三根柱子
     }else{
         hannio(n-1,one,three,two);//把最大盘子上面的N-1个盘子通过第三根柱子移到第二根柱子上去
         move(one,three);//此时就剩下最大的盘子在第一根柱子上面,直接移动到第三根柱子
         hannio(n-1,two,one,three);//把第二根柱子上面的N-1根柱子通过第一根柱子移动到第三根柱子
     }
    }
}
目录
相关文章
|
2月前
|
Java
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
165 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
2月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
3月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
35 1
java基础(11)函数重载以及函数递归求和
|
3月前
|
Java
Java——接口的使用实例
Comparable接口用于自定义类的对象比较。通过实现此接口并重写`compareTo`方法,可以定义自定义类型的比较规则。 接下来介绍了Comparator接口,它提供了一种更灵活的比较方式。通过实现Comparator接口并重写`compare`方法,可以根据不同属性定义不同的比较规则。例如,定义一个`BrandComparator`类来比较汽车的品牌。 最后,介绍了Cloneable接口,用于实现对象的克隆。实现该接口并重写`clone`方法后,可以创建对象的浅拷贝或深拷贝。浅拷贝仅复制对象本身,深拷贝则会递归复制所有成员变量。
40 4
Java——接口的使用实例
|
2月前
|
存储 Java 数据安全/隐私保护
Java中的域,什么是域?计算机语言中的域是什么?(有代码实例)
文章解释了Java中域的概念,包括实例域、静态域、常量域和局部域,以及它们的特点和使用场景。
84 2
|
2月前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
152 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
2月前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
255 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
|
3月前
|
存储 Java
Java之静态(static)与实例(instance)
Java之静态(static)与实例(instance)
|
3月前
|
存储 Java
Java内置数据类型和实例的详解
Java内置数据类型分为基本和引用两类。基本数据类型包括整型(`byte`、`short`、`int`、`long`)、浮点型(`float`、`double`)、字符型(`char`)和布尔型(`boolean`),用于存储简单的数值;引用数据类型则用于存储对象的引用,包括类(如`String`)、接口和数组。掌握这两类数据类型是Java编程的基础。以下示例展示了各种数据类型的使用方法。
47 16
|
3月前
|
Java
Java实例详解
Java实例是通过类创建的对象,其核心在于将抽象的类定义转化为具体的实体。类作为对象的模板定义了属性和行为,而实例则是这些定义的具体实现。通过`new`关键字可以创建实例,并利用点运算符访问其属性和方法。实例拥有自己的生命周期,从创建到使用直至被垃圾回收机制自动清理。此外,实例变量和静态变量的区别在于前者属于单个实例,后者则为所有实例共享。理解Java实例的概念及其管理对编程至关重要。
145 14