巧用数学的思想来解决程序算法问题,这样的代码如诗般优美。通过数学思想来看问题,也能将程序简单化。“斐波那契数列”对于java程序员来说一定不陌生。当然这个问题的解决方案也有很多。用一个例子说明数学思想的优越性。

        题例:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
        传统方法:用三个变量实现。如:
1
2
3
4
5
6
7
8
9
public static int oneMethod() {
    int a = 1, b = 0, c = 0;
    for (int i = 1; i <= 12; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}
        递归实现:
1
2
3
4
5
6
7
8
9
    public static int twoMethod(int index) {
    if (index <= 0) {
        return 0;
    }
    if (index == 1 || index == 2) {
        return 1;
    }
    return twoMethod(index - 1) + twoMethod(index - 2);
}
        用数学思想来解决问题,就相当于找规律。因为“斐波那契数列”并不是没有规律可循。对于这个数列都满足通用公式:Fn=F(n-1)+F(n-2)(n>=2,n∈N*),直接循环一次就可以得到结果,相比于递归和第一种方式是不是简单的多,而且递归次数过多的话,性能也很受影响。
        数学方式实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static int threeMethod(int index) {
    if (index <= 0) {
        return 0;
    }
    if (index == 1 || index == 2) {
        return 1;
    }
    int[] tuZiArray = new int[index];
    tuZiArray[0] = 1;
    tuZiArray[1] = 1;
    for (int i = 2; i < tuZiArray.length; i++) {
        tuZiArray[i] = tuZiArray[i - 1] + tuZiArray[i - 2];
    }
    return tuZiArray[index - 1];
}
    虽然上面三种方法得到的结果都一样,但是我觉得一个程序的好与不好区别在算法。递归也不是不好,只是具体问题的使用场景不同。程序要尽量简单化,而代码也要有精简之美。小小拙见,希望对大家有所帮助。

java算法-数学之美一的更多相关文章

  1. java算法-数学之美二

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

  2. Java算法之“兔子问题”

    package wulj; /** * Java算法之“兔子问题”: * 有一只兔子,从出生后第3个月起每个月都生只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多 ...

  3. 代码规范 & 数学之美读后感

    代码规范链接:https://zh-google-styleguide.readthedocs.io/en/latest/contents/ 数学之美读后感 一开始看名字我以为是一本讲数学是怎么发展的 ...

  4. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  5. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  6. BloomFilter——读数学之美札记

    之前接触过bitmap,读吴军先生的数学之美,看到了一个更强大的数据结构,布隆过滤器(Bloomfilter),赶紧记下来吧,忘了怪可惜的. bitmap的使用是很有局限性的,往往只能用于海量数值型数 ...

  7. 数学之美 zt

    数学是美丽的,哪里有数哪里就有美. 数学的定义是研究数量关系和空间形式的一门科学.但有句名言说:数学比科学大得多,因为它是科学的语言.数学不仅用来写科学,而且可用来写人生.所以说数学是一切学科的基础, ...

  8. java的数学函数总结

    java的数学函数都放在java.lang这个包中,并且这些函数的方法在类Math中是作为static方法出现的,所以要引用一个特定的函数,只需将类Math和一个圆点写在要使用的方法前就好.如方法sq ...

  9. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

随机推荐

  1. zookeeper伪分布式集群安装

    1.安装3个zookeeper 1.1创建集群安装的目录 1.2配置一个完整的服务 这里不做详细说明,参考我之前写的 zookeeper单节点安装 进行配置即可,此处直接复制之前单节点到集群目录 创建 ...

  2. Ubuntu 下安装adobe reader

    ctrl+alt+t打开终端 wget ftp://ftp.adobe.com/pub/adobe/reader/unix/9.x/9.5.5/enu/AdbeRdr9.5.5-1_i386linux ...

  3. Hibernate关系映射(三) 多对多

    一.使用用户User和Role实现多对多的示例 User.java,实现对Role的引用 package com.lxit.entity; import java.util.HashSet; impo ...

  4. Android 歌词显示

    一.概述 项目中设计到歌词显示的问题,这一块之前没有涉及过,只是套用过一个开源的项目,效果还行,于是想到拿来稍作修改,以适应项目需求. 二.歌词控件 先来看下这个自定义控件写的歌词控件吧: publi ...

  5. 操作系统开发之——一个简单的Bootsect

    先吓唬一下读者朋友呵呵,直接发代码:(这是UOS操作系统的Bootsect)(有兴趣的朋友能够增加我们,联系方式在最后) ;------------------------------ ;文件名称:B ...

  6. ACE中静态实例管理方式

    ACE中的很多类使用了单例模式,为了便于管理单例对象,ACE使用了一个组件——ACE_Framework_Component来专门管理. 我们以ACE_Reactor这个单例类的创建和释放为例. 1. ...

  7. git 的简单用法

    在服务器上建立空白库 ssh 70.0.0.236 mkdir /home/git/[proj_dir] cd /home/git/[proj_dir] git --bare init 将本地代码推送 ...

  8. JMeter高速应用

    过去长期用loadrunner做性能測试.可是渐渐认为有些麻烦了: 1.仅仅能执行在windows环境下,而生产环境差点儿清一色的linux.为了在同一网段做性能或压力測试,还须要单独部署一套wind ...

  9. 百度地图和高德地图坐标系的互相转换 四种Sandcastle方法生成c#.net帮助类帮助文档 文档API生成神器SandCastle使用心得 ASP.NET Core

    百度地图和高德地图坐标系的互相转换   GPS.谷歌.百度.高德坐标相互转换 一.在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系: 1.WGS-84原始坐标系,一般用国际GPS纪录仪记 ...

  10. C++开源库大全(转)

    程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列 ...