| 费氏级数(Fibonacci)的学习 
 
 费氏级数(Fibonacci)的学习
 Written by SkyJacker  2007-05-31
 Http://www.cnpack.org
 
 (1)费氏级数数值序列:0,1,1,2,3,5,8,13...
 (2)表示式归纳:Fn = Fn-1 + Fn-2
 (3)存储空间:用无符号 4 字节整数来表示,共有 48 个数据
 (4)意义描述:一对刚生下来的兔子, 两个月之后会繁殖一对兔子,求 N 月之后共有多少对兔子。
 (5)参考资料:
 http://translate.google.com/translate?hl=zh-CN&sl=zh-TW&u=http://www.stat.nctu.edu.tw/MISG/SUmmer_Course/C_language/Cdatastru/DataFib.htm&sa=X&oi=translate&resnum=1&ct=result&prev=/search%3Fq%3D%25E8%25B4%25B9%25E6%25B0%258F%2B%25E7%25BA%25A7%25E6%2595%25B0%2B%25E5%2585%2594%25E5%25AD%2590%26hl%3Dzh-CN%26lr%3D%26newwindow%3D1%26sa%3DG
 http://translate.google.com/translate?hl=zh-CN&sl=zh-TW&u=http://web.nlhs.tyc.edu.tw/~b305/fibonacci&sa=X&oi=translate&resnum=9&ct=result&prev=/search%3Fq%3D%25E8%25B4%25B9%25E6%25B0%258F%2B%25E7%25BA%25A7%25E6%2595%25B0%2B%25E5%2585%2594%25E5%25AD%2590%26start%3D10%26hl%3Dzh-CN%26lr%3D%26newwindow%3D1%26sa%3DN
 (6)关键字:繁殖、一对兔子、两个月
 (7)计算实例:
 有繁殖能力的兔子|兔子总数| 月份
 0                 1         1
 1                 1         2
 1                 2         3
 2                 3         4
 3                 5         5
 5                 8         6
 8
 13
 21
 34
 55
 89
 144
 233
 377
 610
 987
 1597
 2584
 4181
 6765
 10946
 17711
 28657
 46368
 75025
 121393
 196418
 317811
 514229
 832040
 1346269
 2178309
 3524578
 5702887
 9227465
 14930352
 24157817
 39088169
 63245986
 102334155
 165580141
 267914296
 433494437
 701408733
 1134903170
 1836311903
 2971215073
 }
 
 //(8)函数实现:
 // 费氏级数: 有繁殖能力的兔子数
 function FeiShiJiShu(N: Integer): DWORD;
 var
 Fn, Fn1, Fn2: DWORD;
 I: Integer;
 begin
 Fn := 0;
 if n <=1 then
 Result := Fn
 else
 begin
 Fn2 := 0;
 Fn1 := 1;
 Log(IntToStr(Fn2));
 Log(IntToStr(Fn1));
 for I:= 0 to N-3 do
 begin
 if Fn1 >= (High(Fn1) div 2) then // 防止溢出
 Break;
 Fn := Fn2 + Fn1;
 Log(IntToStr(Fn)); // 只须打印 Fn
 Fn2 := Fn1;
 Fn1 := Fn
 end;
 Result := Fn;
 end;
 end;
 {
 (9)相关特性: 费氏级数与黄金分割点(fn/fn+1)
 
 性质:
 0,1,1,2,3,5,8,13,21,34
 fn+2/fn+1 = 1 + fn/fn+1
 13/8 = 1 + 5/8
 
 h1 := 433494437  / 701408733  =
 h2 := 701408733  / 1134903170 =
 h3 := 1134903170 / 1836311903 =
 h4 := 1836311903 / 2971215073 =
 
 计算实例:
 0
 1
 0.000000000000000000
 1.000000000000000000
 0.500000000000000000
 0.666666666666666667
 0.600000000000000000
 0.625000000000000000
 0.615384615384615385
 0.619047619047619048
 0.617647058823529412
 0.618181818181818182
 0.617977528089887640
 0.618055555555555556
 0.618025751072961373
 0.618037135278514589
 0.618032786885245902
 0.618034447821681864
 0.618033813400125235
 0.618034055727554180
 0.618033963166706530
 0.618033998521803400
 0.618033985017357939
 0.618033990175597087
 0.618033988205325051
 0.618033988957902001
 0.618033988670443186
 0.618033988780242683
 0.618033988738303007
 0.618033988754322538
 0.618033988748203621
 0.618033988750540839
 0.618033988749648102
 0.618033988749989097
 0.618033988749858848
 0.618033988749908599
 0.618033988749889596
 0.618033988749896854
 0.618033988749894082
 0.618033988749895141
 0.618033988749894736
 0.618033988749894891
 0.618033988749894832
 0.618033988749894854
 0.618033988749894846
 0.618033988749894849
 0.618033988749894848
 0.618033988749894848
 }
 function FeiShiJiShu_HuangJin(N: Integer): DWORD;
 const
 cnF18 = '%.18f';
 var
 Fn, Fn1, Fn2: DWORD;
 a1, a2: Double;
 I: Integer;
 begin
 Fn := 0;
 if n <=1 then
 Result := Fn
 else
 begin
 Fn2 := 0;
 Fn1 := 1;
 Log(IntToStr(Fn2));
 Log(IntToStr(Fn1));
 for I:= 0 to N-3 do
 begin
 if Fn1 >= (High(Fn1) div 2) then // 防止溢出
 Break;
 Fn := Fn2 + Fn1;
 a1 := Fn1;
 a2 := Fn2;
 Log(Format(cnF18, [a2 / a1]));
 Fn2 := Fn1;
 Fn1 := Fn
 end;
 Result := Fn;
 end;
 end;
 |