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根柱子通过第一根柱子移动到第三根柱子
     }
    }
}

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

to Keep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值