c语言昆不齐郎数列程序,斐波那契数列各种语言的解法.docx

int main()

{

long fib[41] = {0,1};

int i;

for(i=2;i<41;i++)fib[i] = fib[i-1]+fib[i-2];

for(i=1;i<41;i++)printf("F%d==%d\n",i,fib[i]);

getch();

return 0;

}

//利用递归实现指定项输出

第n项和。(1void main()

{

long int f1,f2;

int n,i,c;

scanf("%d",&n);

f1=1;f2=1;

for(i=1;i<=n;i++)

{

c=i+1;

printf("%dItem=%ld %dItem=%ld ",i,f1,c,f2);

if(i%2==0)printf("\n");

f1=f1+f2;

f2=f2+f1;

}

}

[编辑本段]【C#语言程序】

public class Fibonacci

{

//NormRen

static void Main(string[] args)

{

int x = 0, y = 1;

for (int j = 1; j < 10; j++, y = x + y, x = y - x)

Console.Write(y + " ");

}

}

[编辑本段]【Java语言程序】

public class Fibonacci

{

public static void main(String[] args)

{

int x=1,y=1;

System.out.println(x+" ");

for(int i=1;i<=20;i++)

{

System.out.println(y+" ");

y=x+y;x=y-x;

}

}

}

[编辑本段]【JavaScript语言程序】

function Fibonacci(num){

if(num <= 2){

return 1;

}else{

return Fibonacci(num - 1) + Fibonacci(num - 2)

}

}

[编辑本段]【Pascal语言程序】

递推:

var

fib: array[1..40]of longint;

i: integer;

begin

fib[1] := 1;

fib[2] := 1;

for i:=3 to 40 do

fib[i ] := fib[i-1] + fib[i-2];

for i:=1 to 40 do

write(fib[i],' ');

end.

递归:

function fib(n:integer):longint;

begin

if (n=1) then exit(0);

if (n=2) then exit(1);

fib:=fib(n-2)+fib(n-1);

end;

高精度: ( 编写BY : AzraelWZJ )

program fzu1060;

type arr=array[0..1001]of integer;

var a,b,c:arr;

i,j,k,n:integer;

procedure add(var a,b,c:arr);

begin

fillchar(c,sizeof(c),0);

c[0]:=b[0];

for i:=1 to c[0] do

c[i]:=a[i]+b[i];

for i:=1 to c[0] do

begin

c[i+1]:=c[i+1]+(c[i] div 10);

c[i]:=c[i] mod 10;

end;

if c[c[0]+1]>0 then

begin

inc(c[0]);

inc(c[c[0]+1],c[c[0]] div 10);

c[c[0]]:=c[c[0]] mod 10;

end;

a:=b; b:=c;

end;

begin

assign(input,'d:\input.txt');

assign(output,'d:\output.txt');

reset(input);

rewrite(output);

while not eof do

begin

readln(n);

fillchar(a,sizeof(a),0);

fillchar(b,sizeof(b),0);

a[0]:=1; a[1]:=1;

b[0]:=1; b[1]:=1;

if n=1 then write(1)

else

if n=2 then write(1)

else

begin

for k:=3 to n do

add(a,b,c);

for k:=c[0] downto 1 do

write(c[k]);

end;

writeln;

end;

close(input);

close(output);

end.

以上程序为 FZU 1060 的标程.

[编辑本段]【PL/SQL程序】

declare i number :=0;

j number :=1;

x number :=1;

begin

while x<1000

loop

dbms_output.put_line(x);

x:=i+j;

i:=j;

j:=x;

end loop;

end;

[编辑本段]【数列与矩阵】

对于斐波那契数列1、1、2、3、5、8、13、…….有如下定义

F(n)=f(n-1)+f(n-2)

F(1)=1

F(2)=1

对于以下矩阵乘法

F(n+1) = 1 1 * F(n)

F(n) 1 0 F(n-1)

它的运算就是

F(n+1)=F(n)+F(n-1)

F(n)=F(n)

可见该矩阵的乘法完全符合斐波那契数列的定义

设1 为B,1 1为C

1 1 0

可以用迭代得到:

斐波那契数列的某一项F(n)=(BC^(n-2))1

这就是斐波那契数列的矩阵乘法定义。

另矩阵乘法的一个运算法则A¬^n(n为偶数)=A^(n/2)* A^(n/2).

因此可以用递归的方法求得答案。

时间效率:O(logn),比模拟法O(n)远远高效。

代码(PASCAL)

{变量matrix是二阶方阵,matrix是矩阵的英文}

program fibonacci;

type

matrix=array[1..2,1..2] of qword;

var

c,cc:matrix;

n:integer;

function multiply(x,y:matrix):matrix;

var

temp:matrix;

begin

temp[1,1]:=x[1,1]*y[1,1]+x[1,2]*y[2,1];

temp[1,2]:=x[1,1]*y[1,2]+x[1,2]*y[2,2];

temp[2,1]:=x[2,1]*y[1,1]+x[2,2]*y[2,1];

temp[2,2]:=x[2,1]*y[1,2]+x[2,2]*y[2,2];

exit(temp);

end;

function getcc(n:integer):matrix;

var

temp:matrix;

t:integer;

begin

if n=1 then exit(c);

t:=n div 2;

temp:=getcc(t);

temp:=multiply(temp,temp);

if odd(n) then exit(multiply(temp,c))

else exit(temp);

end;

procedure init;

begin

readln(n);

c[1,1]:=1;

c[1,2]:=1;

c[2,1]:=1;

c[2,2]:=0;

if n=1 then

begin

writeln(1);

halt;

end;

if n=2 then

begin

writeln(1);

halt;

end;

cc:=getcc(n-2);

end;

procedure work;

begin

writeln(cc[1,1]+cc[1,2]);

end;

begin

init;

work;

end.

[编辑本段]【数列值的另一种求法】

F(n) = [ (( sqrt ( 5 ) + 1 ) / 2) ^ n ]

其中[ x ]表示取距离 x 最近的整数。

[编辑本段]【数列的前若干项】

1、 1

2 、1

3 、2

4 、3

5 、5

6 、8

7 、13

8 、21

9 、34

10、 55

11 、89

12 、144

13 、233

14 、377

15 、610

16 、987

17 、1597

18 、2584

19 、4181

20 、6765

......

斐波那契弧线

斐波那契弧线,第一,此趋势线以二个端点为准而画出,例如,最低点反向到最高点线上的两个点。三条弧线均以第二个点为中心画出,并在趋势线的斐波纳契水平:38.2%, 50%和61.8%交叉。

斐波纳契弧线,是潜在的支持点和阻力点水平价格。斐波纳契弧线和斐波纳契扇形线常常在图表里同时绘画出。支持点和阻力点就是由这些线的交汇点得出。

要注意的是弧线的交叉点和价格曲线会根据图表数值范围而改变因为弧线是圆周的一部分,它的形成总是一样的。

斐波那契扇形线

斐波那契扇形线,例如,以最低点反向到最高点线上的两个端点画出的趋势线。然后通过第二点画出一条“无形的(看不见的)”垂直线。然后,从第一个点画出第三条趋势线:38.2%, 50%和61.8%的无形垂直线交叉。

这些线代表了支撑点和阻力点的价格水平。为了能得到一个更为精确的预报,建议和其他斐波纳契工具一起使用。

[编辑本段]【斐波那契数列的应用】

数学游戏

一位魔术师拿着一块边长为8英尺的正方形地毯,对他的地毯匠朋友说:“请您把这块地毯分成四小块,再把它们缝成一块长13英尺,宽5英尺的长方形地 毯。”这位匠师对魔术师算术之差深感惊异,因为两者之间面积相差达一平方英尺呢!可是魔术师竟让匠师用图2和图3的办法达到了他的目的!

这真是不可思议的事!亲爱的读者,你猜得到那神奇的一平方英尺究竟跑到哪儿去呢?

实际上后来缝成的地毯有条细缝,面积刚好就是一平方英尺。

斐波那契数列在自然科学的其他分支,也有许多应用。例如,树木的生长,由于新生的枝条,往往需要一段“休息”时间,供自身生长,而后才能萌发新枝。所 以,一株树苗在一段间隔,例如一年,以后长出一条新枝;第二年新枝“休息”,老枝依旧萌发;此后,老枝与“休息”过一年的枝同时萌发,当年生的新枝则次年 “休息”。这样,一株树木各个年份的枝桠数,便构成斐波那契数列。这个规律,就是生物学上著名的“鲁德维格定律”。

另外,观察延龄草、野玫瑰、南美血根草、大波斯菊、金凤花、耧斗菜、百合花、蝴蝶花的花瓣,可以发现它们花瓣数目具有斐波那契数:3、5、8、13、21、……

斐波那契螺旋

具有13条顺时针旋转和21条逆时针旋转的螺旋的蓟的头部

这些植物懂得斐波那契数列吗?应该并非如此,它们只是按照自然的规律才进化成这样。这似乎是植物排列种子的“优化方式”,它能使所有种子具有差不多的 大小却又疏密得当,不至于在圆心处挤了太多的种子而在圆周处却又稀稀拉拉。叶子的生长方式也是如此,对于许多植物来说,每片叶子从中轴附近生长出来,为了 在生长的过程中一直都能最佳地利用空间(要考虑到叶子是一片一片逐渐地生长出来,而不是一下子同时出现的),每片叶子和前一片叶子之间的角度应该是 222.5度,这个角度称为“黄金角度”,因为它和整个圆周360度之比是黄金分割数0.618033989……的倒数,而这种生长方式就决定了斐波那契 螺旋的产生。向日葵的种子排列形成的斐波那契螺旋有时能达到89,甚至144条。

三角形的三边关系定理和斐波那契数列的一个联系

现有长为144cm的铁丝,要截成n小段(n>2),每段的长度不小于1cm,如果其中任意三小段都不能拼成三角形,则n的最大值为多少?

分析:由于形成三角形的充要条件是任何两边之和大于第三边,因此不构成三角形的条件就是任意两边之和不超过最大边。截成的铁丝最小为1,因此可以放2 个1,第三条线段就是2(为了使得n最大,因此要使剩下来的铁丝尽可能长,因此每一条线段总是前面的相邻2段之和),依次为:1、1、2、3、5、8、 13、21、34、55,以上各数之和为143,与144相差1,因此可以取最后一段为56,这时n达到最大为10。

我们看到,“每段的长度不小于1”这个条件起了控制全局的作用,正是这个最小数1产生了斐波那契数列,如果把1换成其他数,递推关系保留了,但这个数列消失了。这里,三角形的三边关系定理和斐波那契数列发生了一个联系。

在这个问题中,144>143,这个143是斐波那契数列的前n项和,我们是把144超出143的部分加到最后的一个数上去,如果加到其他数上,就有3条线段可以构成三角形了。

记忆是一种可以被用来避免重复昂贵的运算以加速程序的技术,先展示一个队斐波那契数列(Fibonacci Sequence)的实现,它用两个递归调用来计算给定输入的值。

function fibonacci(x) {

if (x < 2) {

return 1;

}

return fibonacci(x - 1) + fibonacci(x - 2);

}

斐波那契数列的计算是十分昂贵的,它迅速产生了太多的递归调用给浏览器来处理。同归把函数包裹在一个闭包中,我们可以手工技艺计算过的值以优化这个方法。

var fibonacci = (function (){

var cache = {};

function fibonacci(x) {

if (x < 2) {

return 1;

}

if (!cache [x]) {

cache [x] = fibonacci(x - 1) + fibonacci(x - 2);

}

return cache [x];

//return fibonacci(x - 1) + fibonacci(x - 2);

}

return fibonacci;

})();

这个版本的斐波那契的实现使用cache变量缓存了函数执行的结果,运行起来要比原来的那个速度快几个数量级,然而,把计算和缓存逻辑混合是有些难看。我们添加一个通用的函数给Function.prototype以帮助分离它们。

if (!Function.prototype.memoize) {

Function.prototype.memoize = function() {

var cache = {};

varfunc = this;

var join = Array.prototype.join;

return function(x) {

var key = join.call(arguments);

if (!(key in cache)) {

cache [key] = func.apply(this, arguments);

}

return cache [key];

}

}

}

上面的方法将参数使用Array的join函数将所有参数转换为字符串做为key存储再缓存变量中

var fibonacci = fibonacci.memoize();

fibonacci(30);

这样就使第一个例子拥有了记忆功能,加快了浏览器的运算速度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值