编程题阶乘迷局:破局到优化的代码与思路分析

1.前言

写本文的起因是在csdn看到一个比较有意思的博客
原文链接:https://blog.csdn.net/dotnetstudio/article/details/103089463

这篇文章只给定了情景和结果.并没有具体的分析 对于初学java编程的人来说 可能有些绕 一时间绕不出来.
本文针对这篇文章的情景和结果进行详细的思路分析.

2.情景

给定一个整数,求该整数的阶乘,例如输入5,结果是5 X 4 X 3 X 2 X 1=120。

3.解题方法以及思路

传统解题方法及思路

刚看到这个题目的时候 我没看下边的答案
我第一个想到的就是循环. 利用循环去进行逐步的相乘.也就是

	public calc(int num){
			int result=1;
			for(int i=1;result<=num;i++){
				result=result*i;
			}
			System.out.println("得出结果:"+result);
			return result;
}

这里我们详细解释一下

1.为什么给result取1 而不是0?

因为如果result是0的话.那么进入循环体.
如果0<=num成立的话.下边执行的是
result=0*i=0

然后继续执行n次 最终的结果都是0 因为0乘以任何数字都是零 是无法得到结果的 而且我们的阶乘也没有乘以零这个内容.

2.为什么i是从1开始而不是从0开始?
不从0开始的原因同1.
但是从1开始也不是最优选择 因为你乘以1的话 得到的结果还是result本身 所以这个循环没有意义
完全可以省略掉, 所以可以优化一下 设置成i从2开始.

如果你看过原文你就知道 到这里并没有结束.因为我们还没有优化!
为什么需要优化?
首先原文提到了. 这么写没有拿到offer
第二 我们进行这个阶乘的操作的时候 使用了三个变量以及循环 略显复杂.
那么除了上边传统的解题思路 还有什么更简单的方法吗?
有!

简化解题思路

这里也是原文提到的 我们可以用递归求解.

public int calc(int num){

	if(num==1){
		return num;
	}
	return num*calc(num-1);

}

这个代码就简单了
一个变量 两行代码解决战斗
这里我们来分析一下逻辑
我们现在调用calc方法 假设我们传入了5
那么就是先判断 5=.=1 明显是个false 所以走到return
这里return了一个5乘以calc(5-1) 也就是5乘以calc(4)
那我们就继续走calc 这是传入的是4
4=.=1 明显也是false
走到了下面的return 这里return了一个 4乘以calc(3)
那么结合上边的结果 这里完整的结果应该是:
5乘以4乘以calc(3)
这里我们可以看出来规律了
这其实就是把一个数字传给calc方法 进行判断 如果不是1 那么就返回这个数字乘以比他小1的数字
这不就正好是我们阶乘要遵行的规律么??

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值