【递归知识+练习】


递归

递归的概念

一个方法在执行过程中调用自身, 就称为 “递归”。

递归的必要条件:

  1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
  2. 递归出口(也就是要有一定的条件让递归结束,否则会死循环
  3. 在写递归之前,想一想这个题目是否可以用递归公式解决

♥♥♥ 栈存储的顺序:

在这里插入图片描述

按顺序打印一个数字的每一位

(例如1234 打印出 1 2 3 4)

public class Test {
    public static void main(String[] args) {
        print(1234);
    }
    public static void print(int n){
    //递归结束条件,满足条件后进入打印1,返回1
        if(n<10){
            System.out.println(n);//先打印再返回
            return ;
        }
        //递123,递12 再递1
        print(n/10);
        //归12打印2,归123打印3
        System.out.println(n%10);
    }
}

递归求N!的阶层

public class Test {
    public static void main(String[] args) {
        System.out.println(fac(5));
    }
    public static int fac(int n){
    //条件必不可少
        if(n==1){
            return 1;
        }
        int sum= n * fac(n-1);
        return sum;
    }
}

递归求1+2+3+4+…+10

public class Test {
    public static void main(String[] args) {
        System.out.println(sum(10));
    }
    public static int sum(int n){
        if(n==1){
            return 1;
        }
        return n+sum(n-1);
    }
}

写一个递归方法,输入一个非负整数。返回组成它的数字之和(不熟)

例如,输入1729,返回1+7+2+9,它的和是19

public class Test {
    public static void main(String[] args) {
        System.out.println(sum(123));
    }
    public static int sum(int i){
        if (i<10){
            return i;
        }
        return i%10+sum(i/10);//3+sum(12/10) 2+sum(1)

    }
}

斐波那契数列(不熟)

在这里插入图片描述

在这里插入图片描述

//斐波那契数列
//不建议用递归写,太多重复的
//建议用for循环写

public class Test {
    public static void main(String[] args) {
        System.out.println(sum(5));
    }
    public static int sum(int n){
        int f1=1;
        int f2=1;
        int f3=2;
        if (n==1){
            return 1;
        }
        if (n==2){
            return 1;
        }
        for (int i = 3; i <= n; i++) {
               f3=f1+f2;
                f1=f2;
                f2=f3;
        }
        return f3;
    }
}

递归求汉诺塔(难点)

public class Test {
    //移动的方法,盘子是字符char类型
    public static void move(char pos1,char pos2){
        System.out.print(pos1 +" => "+ pos2 +"  ");
    }
    //方法括号里的参数有盘子个数,三根柱子
    public static void hanio(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return ;
        }
        //递归,把n-1个盘子从起始位置移动到pos3,再把pos3的盘子移到pos2
       hanio(n-1,pos1,pos3,pos2);
        //把pos1的盘子移到pos3
        move(pos1,pos3);
        //把pos2的盘子移到pos1上,再把pos1的盘子移到pos3上
        hanio(n-1,pos2,pos1,pos3);

    }

    public static void main(String[] args) {
        hanio(1,'A','B','C');//第一个盘子
        System.out.println();
        hanio(2,'A','B','C');//第二个盘子
        System.out.println();
        hanio(3,'A','B','C');//第三个盘子
    }
}

总结

今天专攻递归,写了几道题目感觉还不错,对递归的思维更深刻了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值