递归常见习题 Java实现

求N的阶乘
    //递:3*fac(2)-->2*fac(1)-->1   归:1-->fac(1)*2-->fac(2)*3-->找到结果
    public static int fac(int n){
        if (n == 1) {
            return 1;
        }
        int tmp=n*fac(n-1);//fac调用函数自身
        return tmp;
    }
    public static void main(String[] args) {
        System.out.println(fac(3));
    }
求1+2+3+...+n
    public static int sum(int n){
        if (n==1){
            return 1;
        }else {
            return n+sum(n-1);
        }
    }
    public static void main(String[] args) {
        System.out.println(sum(10));
    }
按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
 //n=1234  func(1234/10)(!<=9)-->func(123/10)-->func(12/10)-->得到func(1)-->小于9return   12%10=2-->123%10=3-->1234%10=4
    //注意:若没有return那么就没有结束条件-->会一直在栈上开辟内存-->栈溢出
    public static void func(int n){
        if(n<=9){
            System.out.println(n);
            return;
        }
        func(n/10);
        System.out.println(n%10);
    }

    public static void main(String[] args) {
        func(1234);
    }
求斐波那契数列的第n项
//采用递归实现会出现大量重复计数 更推荐循环实现
public static int fib(int n){
        if(n==1||n==2){
            return 1;
        }
        return fib(n-1)+fib(n-2);
    }
    public static void main(String[] args) {
        System.out.println(fib(5));
    }
汉诺塔问题
    //假设有三个柱子p1,p2,p3
    // 起初有n个盘子在p1  总体来看就是先将n-1个盘子从p1借助p3移动到p2  再将p2的n-1个盘子借助p1移动到p3
    public static void han(int n,char p1,char p2,char p3){
        if (n == 1) {
            move(p1, p3);
            return;
        }
        han(n-1,p1,p3,p2);
        move(p1,p3);
        han(n-1,p2,p1,p3);
    }
    public static void move(char p1,char p2){
        System.out.println(p1+"->"+p2);
    }

    public static void maina(String[] args) {
        han(1,'a','b','c');//假设有1个盘子,应如何挪动
        han(3,'A','B','C');//假设有3个盘子,应如何挪动
    }
青蛙跳台阶
    //青蛙跳台阶一次跳一个或两个...或n个  跳1-->剩n-1  2-->n-2 ... n-1-->1  n-->0
    //由此可知
    //f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(1)+f(0)
    //f(n-1)=f(n-2)+f(n-3)+...+f(1)+f(0)
    //因此可求出
    //f(n)-f(n-1)=f(n-1) ---->  f(n)=2*f(n-1)
    public static int jump(int n){
        if (n == 1) {
            return 1;
        }if (n == 2) {
            return 2;
        }
        int tmp = 2*jump(n-1);
        return tmp;
    }
    public static void main(String[] args) {
        System.out.println(jump(5));//假设台阶数为5应有多少种跳法
    }

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

半颗星辰、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值