日期:2014-05-20  浏览次数:20694 次

关于黄金分割数0.618的题目,有疑惑,求解

    黄金分割数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
程序如下:
public class zero_618
{
public static final double T=(Math.sqrt(5)-1)/2;
public static final double T1=0.618034;  //精度
public static final double T2=Math.abs(T-T1);

public static int f(int n){
if(n==1){
return 1;
}
if(n==2){
return 3;
}
int n1 = f(n-1);
int temp = n1+f(n-2);
double d = Math.abs(n1*1.0/temp-T);
if(d<T2)
//if(d<0.0000001)  可否用这句替换上面那一句?
{
System.out.println("重第"+(n-1)+"个数开始精确度高。");
System.out.println(n1+"/"+temp+"="+(n1*1.0/temp));
return 0;
}
return temp;
}

public static void main(String[] args){
int i=1;
while(true)
{
int n=f(i);
if(n==0)
{
break;
}
i++;
}
}

}
疑惑是:“其真值可以通过对5开方减去1再除以2来获得”这句话是不是一定要用上?如果只是要求精确到0.618034的话似乎从17项也能精确到这一精度了吧,这样的判断语句是否可以改为if(d<0.0000001)(程序中红笔处)结果为:9349/15127=0.6180339789779864,谁知道正确答案的?究竟是到第几项?
java?编程?黄金分割线 java 编程 黄金分割数 程序

------解决方案--------------------
主要是对精度的理解有问题。
0.618034只是一个近似值,它的精度是它与"对5开方减去1再除以2"的近似程度,也就是T2
所以不可以用if(d<0.0000001)替换
------解决方案--------------------
精度我觉得应该是指值在0.6180335 和 0.6180344之间
	public static void main(String[] args) throws Exception {
g(618034, 1, 3);
}

private static void g(long accuracy, int a, int b) {
accuracy *= 10;
long s = 1;
while (s < accuracy) {
s *= 10;
}
for (int i = 1; i < 30; i++) {
long k = s * a / b;
if (k >= accuracy - 5 && k < accuracy + 5) {
System.out.println(String.format("%d:%d/%d=%.10f", i, a, b, 1.0 * a / b));
//break;
}
int c = a;
a = b;
b += c;
}
}