zoukankan      html  css  js  c++  java
  • java算法-数学之美二

    上一章已经说过利用数学思想来解决程序算法问题,实际上就是找规律。这在我们上学时经常遇到,比如给出一段数字,求某一个位置该填写什么数,只要找到规律那就迎刃而解。好了,废话不多说,再来看看案例分析。

            示例:计算1+2+3+4+5+6+……+100的结果。这个示例算是比较简单了,主要是让大家能够理解这种思想。可能按照多想人的想法要这样做,直接一个循环累加不就完了吗?于是第一种解法就出来了。
             传统方法 :循环累加,一个for就OK。如:
    	public static int oneMethod(int index) {
    		int sum = 0;
    		if (index <= 0) {
    			return 0;
    		}
    		// 循环区间累加
    		for (int i = 1; i <= index; i++) {
    			sum += i;
    		}
    		return sum;
    	}
    

    可能还有的人会用递归算法来解决。如:

    	public static int twoMethod(int index) {
    		if (index <= 0) {
    			return 0;
    		}
    		return twoMethod(index - 1) + index;
    	}
    

    上面两种方法虽然都解决了问题,但是我认为这不是最好的解法。当index很大的时候,程序肯定吃不消的。而这样的数列甚至不用思考,完全是初中就学过的等差数列对于1+2+3+4+5+6+……+100数列,都满足于(首项+末项)*项数/2,也就是n(n+1)*项数。不用循环也不用递归,一个公式就能解决问题了。
    数学思想:

    	public static int threeMethod(int index) {
    		if (index <= 0) {
    			return 0;
    		}
    		return index * (index + 1) / 2;
    	}
    
            既简单又容易理解,而且效率占优。这样的程序能不是好程序吗?
            再来一个例子:1-2+3-4+5-6+……-100的结果。这样的数列也是经常见到的。而且当n是偶数的算法和当n是奇数的时候算法都不一样。
            当n是偶数时:满足-n/2的计算公式;当n是奇数时:满足(1+n)/2的计算公式。

    所以最终的解法要用三目运算判断返回的结果。如:

    	public static int calcRangeResult(int index) {
    		if (index <= 0) {
    			return 0;
    		}
    		return index % 2 == 0 ? calcRangeResult(index - 1) - index
    				: calcRangeResult(index - 1) + index;
    	}
    

    是不是 so easy呀。

  • 相关阅读:
    查看本机安装了哪些.Net Framework版本的方法
    tomcat启动超时, Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds...
    设置PL/SQL Developer 字符集
    JDK安装与环境变量配置
    function 与 => 的区别
    如何使用tomcat,使用域名直接访问javaweb项目首页
    Spring整合Struts2
    Oracle to_char函数的使用方法
    PLSQL 误删表恢复操作
    Python可视化动态图表,基于Python环境,使用jupyter notebook编辑ipynb文件,基于pyecharts生成Sankey的桑基图HTML制作
  • 原文地址:https://www.cnblogs.com/hongzai/p/3246657.html
Copyright © 2011-2022 走看看