java 实现黄金分割数的示例详解

黄金分割数 0.618 与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的 0.618 处,

墙上的画像一般也挂在房间高度的 0.618 处,甚至股票的波动据说也能找到 0.618 的影子…

黄金分割数是个无理数,也就是无法表示为两个整数的比值。

0.618 只是它的近似值,其真值可以通过对 5 开方减去 1 再除以 2 来获得,

我们取它的一个较精确的近似值:0.618034

有趣的是,一些简单的数列中也会包含这个无理数,这很令数学家震惊!

1 3 4 7 11 18 29 47 … 称为“鲁卡斯队列”。它后面的每一个项都是前边两项的和。

如果观察前后两项的比值,即:1/3,3/4,4/7,7/11,11/18 … 会发现它越来越接近于黄金分割数!

你的任务就是计算出从哪一项开始,这个比值四舍五入后已经达到了与 0.618034 一致的精度。

请写出该比值。格式是:分子/分母。比如:29/47

/*
*/
package Question40_49;
public class Question44 {
public static void main(String[] args) {
int a=1,b=3,t;
while(true){
if(Math.abs((double)a/b-0.618034)<0.000001){
System.out.println(a+"/"+b+" = "+(double)a/b);
break;
}
t=a;
a=b;
b+=t;
}
}
}

运行结果:

1364/2207

补充:费波那契数列java两种实现+逼近黄金分割率功能

费波那契数列的简单实现,这是常见的递归问题,但实现的方法有很多种,当然算法肯定要简单高效的了,

网上那些递归算法总觉得不好看,所以我自己就写了下面这个程序,毕竟算法是根据问题出来的,遇到不会的问题还是有自己的想法比较好,特别是算法这方面的。

package test;

import java.text.DecimalFormat;
import java.util.Arrays;

//两种方法打印个数为n的斐波那契数列
public class Fibonacci {

 //不借助工具容器的数学计算,当增加的功能越来越多时,简洁性和可读性都会大大降低
 // n为需要显示的数列个数 (注:仅显示int值范围类数列,大概能显示45个)
 protected void way1(int n) {
 int n1 = 1;
 int n2 = 1;
 int count = 0;
 String string = new String(1+"\t"+1+"\t");
 if(n == 1) {
 System.out.println("1");
 }
 //可显示n为1开始的任何数的数列
 while( count != n/2 -1 ) {
 n1 += n2;
 string += Integer.toString(n1)+"\t";
 n2 += n1;
 string += Integer.toString(n2)+"\t";
 count ++;
 }
 if (n%2!=0) {
 n1 = n1 + n2;
 string += Integer.toString(n1)+"\t";
 }
 System.out.println(string);
 }

 //借助数组的迭代实现,有很好的可读性,同时十分简洁,在后续功能增加的情况下也不复杂
 //比如这里增加一个功能,求黄金分割率,要用上面的实现的话,那代码就太乱了
 protected void way2(int n) {
 int[] fbci =new int [n];
 double[] goldindex = new double[n-1];
 fbci[0] = 1;
 fbci[1] = 1;
 goldindex[0] = 1.00;
 for (int i = 2; i < fbci.length; i++) {
 fbci[i] = fbci[i-1] + fbci[i-2];
 }

 DecimalFormat dFormat = new DecimalFormat("0.000000");//控制小数位数,可取消该功能
 String result = new String();
 for (int i = 1; i < goldindex.length; i++) {
 goldindex [i] = (double)(fbci[i])/(double)(fbci[i+1]);
 result += dFormat.format(goldindex [i])+"\t";
 }
 System.out.println(Arrays.toString(fbci));
 System.out.println(result);
 }

 public static void main(String[] args) {
 // TODO Auto-generated method stub
 Fibonacci a1 = new Fibonacci();
 a1.way1(15);
 a1.way2(15);
 }
}

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

0.500000 0.666667 0.600000 0.625000 0.615385 0.619048 0.617647 0.618182 0.617978 0.618056 0.618026 0.618037 0.618033

补充:JAVA中黄金分割点的问题

描述:

寻找某两个数相除,其结果 离黄金分割点 0.618最近

(1)分母和分子不能同时为偶数

(2)分母和分子 取值范围在[1-20

/**
* <p>Title: Excise1</p>
* <p>Description:    黄金分割点              </p>
*  描述:寻找某两个数相除,其结果 离黄金分割点 0.618最近
*  (1)分母和分子不能同时为偶数      (2)分母和分子 取值范围在[1-20]
* @author Mr.chen
* @date 2018年8月22日
*/
public class Excise1 {
 public static void main(String[] args) {

  int A = 0;          //A 比较后传出来的新分子
     int B=1;           //B 比较后传出的新分母
     double c=0,C=1;   //C 比较后传出来的新a/b的值
     for(int a=1;a<21;a++) {   //循环分子
       for(int b=1;b<21;b++) { //循环分母
         if(a%2==0&b%2==0)  //如果两个同时为偶数是跳出
           continue;
         c=(double)a/b;    //计算a/b的值并且 强制转化类型 赋值给c
         if(Math.abs(c-0.618)<Math.abs(C-0.618)) { //如果通过math函数调用.abs()方
                             法;取方法内参数的绝对值
           C=c;   //通过画x坐标轴 如果算出来的值小于一开始设定的(大C-0.168)就证
               // 明距离0.168左边的距离比右边的短 所以赋值给大C 并且再次循环
               //目的使得通过循环让分子和分母的比值越来越趋近于0.168
           A=a;  //将合适的分子a赋给一开始设定好的A
           B=b;   //将合适的分母b赋给一开始设定好的B
         }

       }
     }
     System.out.println("离黄金分割点(0.618)最近的两个数相除是:"+A+"/"+B+"="+C);
 //将传给A B 的值输出来
  }
}

对于小白的我来说这个逻辑是真的屌!!!!!!!!!!!!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Java实现文件分割与合并

    本文实例为大家分享了Java实现文件分割与合并的具体代码,供大家参考,具体内容如下 文件的操作 文件的分割 package com.xhh.util; import java.io.*; /** * 文件分割的方法 * @param SrcFilePath 指定分割的文件路径 * @param SingleGoalFileSize 分割文件的个数 * @param GoalFileDirectory 分割之后的路径 */ public class Split{ public static voi

  • Java StringUtils字符串分割转数组的实现

    我们在日常开发时会经常遇到将一个字符串按照指定的字符进行分割. 这时,我们往往会想到使用str.split(","),进行处理得到分割后的数组. 然而, 使用split()方法在分割特殊的字符时是需要转移的.如小数点"." 下面我为大家推荐一种可以无需转义,即可分割的方法. 使用 org.springframework.util.StringUtils 中的 delimitedListToStringArray(str,delimiter) 进行测试 public

  • Java中分割字符串的两种方法实例详解

    前言 相信大家应该都知道在java编程中,有时候我们需要把一个字符串按照某个特定字符.字母等作为截点分割这个字符串,这样我们就可以使用这个字符串的一部分或者把所有截取的内容保存到数组里等操作.下面这篇文章就给大家分享了两种分割的方法,下面来一起看看吧. 一.java.lang.String 的 split() 方法, JDK 1.4 or later public String[] split(String regex,int limit) 示例代码 public class StringSpl

  • java 实现黄金分割数的示例详解

    黄金分割数 0.618 与美学有重要的关系.舞台上报幕员所站的位置大约就是舞台宽度的 0.618 处, 墙上的画像一般也挂在房间高度的 0.618 处,甚至股票的波动据说也能找到 0.618 的影子- 黄金分割数是个无理数,也就是无法表示为两个整数的比值. 0.618 只是它的近似值,其真值可以通过对 5 开方减去 1 再除以 2 来获得, 我们取它的一个较精确的近似值:0.618034 有趣的是,一些简单的数列中也会包含这个无理数,这很令数学家震惊! 1 3 4 7 11 18 29 47 -

  • Java实现图片合成的示例详解

    目录 场景 环境 搭建 引入pom文件 定义核心接口ImageService 定义核心接口实现类ImageServiceImpl 测试ImageController 测试效果 总结 场景 前端有一个神器——canvas,这个画布标签可以处理各种图片的合成,可以精确到图片的具体坐标,加水印,去水印,简直不要太简单!那java后端可以处理吗?请大声的告诉他,能,必须能!今天小编告诉你一个神器——image-combiner,合成图片so easy! 环境 jdk1.8 spring boot 搭建

  • Java垃圾回收机制的示例详解

    目录 一.概述 二.对象已死? 1.引用计数算法 2.可达性分析算法 3.四种引用 4.生存还是死亡? 5.回收方法区 三.垃圾收集算法 1.分代收集理论 2.名词解释 3.标记-清除算法 4.标记-复制算法 5.标记-整理算法 一.概述 说起垃圾收集(Garbage Collection,下文简称GC),有不少人把这项技术当作Java语言的伴生产 物.事实上,垃圾收集的历史远远比Java久远,在1960年诞生于麻省理工学院的Lisp是第一门开始使 用内存动态分配和垃圾收集技术的语言.当Lisp

  • Java实现跳跃表的示例详解

    跳表全称叫做跳跃表,简称跳表,是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表.跳表在原有的有序列表上面增加多级索引,通过索引来实现快速查找.跳表不仅能提高搜索性能,同时也提高插入和删除的性能,redis中的有序集合set就是用跳表实现的,面试时候也经常会问. 这里我们原始数据个数n=10,以间隔k=2建立索引,则第一层索引10/2=5个,第二层⌈10/2^2⌉=3个,第三层⌈10/2^3⌉=2个,第四层⌈10/2^4⌉=1个.根据上图我们来分析一下,跳表的结构是一棵树(除原始数据

  • Java I/O流使用示例详解

    目录 1.java IO包 2.创建文件 3.获取文件信息 4.目录操作 5.字节输入流InputStream 6.字节输出流FileOutputStream 7.模拟文件拷贝 8.字符输入流FileReader 9.字符输出流FileWriter 1.java IO包 Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据的序列.输入流表示从一个源读

  • Java中随机函数变换的示例详解

    目录 说明 解决的问题 问题1 问题2 问题3 问题4 说明 本示例中基于 Java ,其他语言也有类似的 API 解决的问题 问题1 Java 中 Math.random()函数是等概率返回区间[0,1)中的任意一个小数.即x < 1情况下,[0,x)中的数出现的的概率是x,如果我们要将x < 1情况下,[0,x)中的数出现的的概率调整成x^2,应该如何做? 问题1思路 由于[0,x)的概率是x,那么调用两次Math.random(),如果较大的那个值也要在[0,x)区间内,那么两次调用都必

  • java CompletableFuture异步任务编排示例详解

    目录 前言 同步串行 异步串行 并行任务 多任务结果合并计算 任一任务完成 快速失败 注意 前言 在之前的项目开发中,都没怎么使用过CompletableFuture的功能,只听说过和异步编程有关.为了能够在将来有需要的时候用得上,这两天花了点时间学习了一下,并简单地总结一下如何使用CompletableFuture完成异步任务编排. 先创建一个自定义的线程池,后续所有代码都会使用到: private static final ThreadPoolExecutor THREAD_POOL_EXE

  • Java之单例设计模式示例详解

    单例设计模式 保证一个类在内存中只能有一个对象. 思路: 1)如果其他程序能够随意用 new 创建该类对象,那么就无法控制个数.因此,不让其他程序用 new 创建该类的对象. 2)既然不让其他程序 new 该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了. 3)该类将创建的对象对外(整个系统)提供,让其他程序获取并使用. 饿汉式: 一上来我就把对象给你 new 好了,你来了直接就可以拿去"吃"了 懒汉式 (要是有人问单例的延迟加载方式指的就是这种方式) 一开始

  • java 实现迷宫回溯算法示例详解

    用一个7 x 7的矩形表示迷宫,0和1分别表示的是通路和障碍.通过设计编写程序找到蓝色小球达到蓝色旗子的路线 思路: 构建一个迷宫(用二维数组)实现找通路的方法findRoad() 构建二维数组不难,我们主要是要实现findRoad()这个方法,在实现这个方法前,我们需要约定好一下几个点:小球的位置当作入口(1,1),小旗的位置当作出口(5,5)数组里数的含义分别为(0没有走过).(1障碍).(2走过且为正确的路线).(3走过且为错误的路线)将我们每一步的走法称为策略:下 -> 右 -> 上

  • Java实现并查集示例详解

    目录 题目 思路 find实现 join的实现 整体代码  题目 题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 思路 对于该题而言,考察的是并查集,也就是小怪兽逐个找上级领导的思路,指导找到最终的Boss停止下来,如果两个怪兽要打架,需要问一问他们的上级领导,领导再问领导,逐级向上,最终发现它们属于同一个Boss的部署的话就不能再打架了,这道题同样的思路,如果斗罗大陆的一开始白沉香不知道唐三是亲戚的话,他们就

随机推荐