JAVA小案例-递归:计算n!

JAVA小案例-递归:计算n!

首先抛出概念,什么是递归?
说白了就是自己调用自己。
递归的结构:
(1)递归头:就是什么时候不调用自身的方法,也就是递归结束的条件
(2)递归体:就是什么时候需要自身调用自身方法,调用的时候是怎么调用的

概念有点抽象,直接看例子:

public class Digui {
    /**
     * 递归:计算n!
     * @param args
     */
    public static void main(String[] args) {
        long d1 = System.currentTimeMillis();
        System.out.printf("%d阶乘的结果:%s%n",10,factorial(10));
        //printf的用法,这么整就省的打好几次引号了
        //%d代表放前边的东西,就是10
        //%s代表放后边的东西,就是factorial(10)
        //%n是换行,也可以用\n
        long d2 = System.currentTimeMillis();
        System.out.printf("递归费时:%s%n",d2-d1);
    }
    static long factorial(int n){
        if (n==1){  //递归头
            return 1;
        }else {     //递归体
            return n*factorial(n-1);  //n*(n-1)
//从递归头开始,判定n如果等于1,就结束,否则走else分支,走分支的时候,走到return,在这里发生了递归,就是自己调自己
//在开头的main方法里,设定的入参是10,说明要算的是10的阶乘,n最开始是10,第一次走到return发生递归后,n就变成9了
//这个东其实可以理解成函数f(x),第一次是f(10),递归一次后变成10*f(9),说白了就是n*(n-1),一直循环运行
//一直循环到n=1时,走if分支,结束,这个时候递归整体过程就变成10*9*8*7*6*5*4*3*2*1了            
        }
    }
}

结果如下:
在这里插入图片描述

  • 阶乘应该不用再过多解释了吧我敲!比如3!,就是3的阶乘,就3×2×1。
  • 首先说一下例子里边的static,这个叫静态,如果没有它,我们在一个方法中调用另一个没有定义static的方法的话,是需要先创建一个对象的,就是new,然后才能调用这个没有定义static的方法。有了static之后,不用创建对象也能直接调用。
  • System.currentTimeMillis();这个勾八东西是啥呢?这个实际上就是获取当前时间,递归前递归后各运行一次,一做差,递归的耗时就出来了

那么为什么要整个计时的东西呢?其实这个递归这个东西不太好,瞅着代码挺简单,但是挺耗费资源,也费时,但是有些时候避免不了得用它。

但是对于这个例子完全可以用循环语句来做,其实耗时很少,也不复杂,就是代码多点,如下:

public class Xunhuanjiecheng {
    /**
     * 用循环来做阶乘
     * @param args
     */
    public static void main(String[] args) {
        long d3 = System.currentTimeMillis();
        int a = 10;
        int result = 1;
        while(a>1){  //a只要大于1就一直循环
            result = result*a*(a-1);
            a=a-2;
        }
        long d4 = System.currentTimeMillis();
        System.out.println(result);
        System.out.printf("普通循环用时:%s%n",d4-d3);
    }
}

在这里插入图片描述
可以发现算的很快,基本不费时间

总结一句话,这个递归能不用就不用,实在没招了再用,用循环还快还省内存。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值